2017-04-04 11 views
0

私は大学のためのminishellプロジェクトを行っています。私はバックグラウンドでコマンドを実行する方法がわかりません。私が知っていることは、私はwaitpid()とsigaction()を使わなければならないということです。もし誰かが私にこれを手渡すなら、私は感謝しています。ここで私が使用しているミニコードコマンドを利用するためのコードの一部です。Minishellの背景

void execute_command_line(command* cmds, int n){ 
     pid_t id,pid; 
     int status; 
     id=fork(); 
     if(id==-1){ 
      exit(EXIT_FAILURE); 
     } 
     else if(if==0){ 
       execvp(cmds[0] . argv[0],&cmds[0] .argv[0]); 
       exit(0); 
     } 
     else{ 
      pid=wait(&status); 
      if(pid==-1){ 
       perror("Father: an error has ocurred.\n"); 
       exit(EXIT_FAILURE); 
      } 
      else if(pid==id){ 
        printf("Father: the son has ended.\n"); 
      } 
    } 

}

答えて

0

バックグラウンド・プロセスの重要な特徴は、あなたがそれと対話することはできません(それはまだあなたの端末に印刷できる)ということです。これは、少なくとも、キーボード生成の信号をそのプロセスに配信してはならないことを意味します。 これはsetsid()を呼び出して新しいセッションを作成することで実現できます。または、子プロセスのキーボード信号を無効にすることでシミュレートできます(sigactionがあります)。

waitpidを使用することは、親がすぐに終了しないことを意味しますが、バックグラウンドの子が終了するまで待機します(waitpidを使用)。

So ... waitをwaitpid()に置き換え、sigaction()でキーボード割り込み(SIGINTとSIGQUIT)を無効にすると、バックグラウンドで実行されます。