3

私の学校のプロジェクトでは、シェルを実装していますが、ジョブ制御の助けが必要です。たとえば、コマンドを入力すると、バックグラウンドで実行されるはずですが、機能していませんcat &&私はこのコードを持っています:

{
  int pid;  
  int status;  
  pid = fork();  
  if (pid == 0) {  
    fprintf(stderr, "Child Job pid = %d\n", getpid());  
    execvp(arg1, arg2);  
  } 
  pid=getpid();  
  fprintf(stderr, "Child Job pid is = %d\n", getpid());      
  waitpid(pid, &status, 0);  
}
4

2 に答える 2

3

すぐに待機するのではなく、SIGCHLD シグナルのシグナル ハンドラを設定する必要があります。SIGCHLD は、子プロセスが停止または終了するたびに送信されます。プロセス完了の GNU の説明を確認してください。

この記事の最後には、サンプル ハンドラーがあります (これを多かれ少なかれコピーして以下に貼り付けました)。それからコードをモデル化してみてください。

 void sigchld_handler (int signum) {
     int pid, status, serrno;
     serrno = errno;
     while (1) {
         pid = waitpid(WAIT_ANY, &status, WNOHANG);
         if (pid < 0) {
             perror("waitpid");
             break;
         }
         if (pid == 0)
           break;
         /* customize here.
            notice_termination is in this case some function you would provide
            that would report back to your shell.
         */             
         notice_termination (pid, status);
     }
     errno = serrno;
 }

このテーマに関するもう 1 つの優れた情報源は、Advanced Programming in the UNIX Environmentの第 8 章と第 10 章です。

于 2012-11-11T04:53:00.540 に答える
1

親プロセスは子プロセスを呼び出しwaitpidており、子プロセスの状態が変化する (つまり、終了する) までブロックされます。

于 2012-11-11T03:56:36.133 に答える