2

を使用してコマンドを実行する子プロセスをフォークしていexecveます。次のように、SIGCHLD、SIGINT、およびSIGSTPの3つのシグナルハンドラーをインストールして定義しています。

void sigchld(int sig)
{
while((pid=waitpid(-1,&stat,WNOTRACE|WNOHANG))>0)
{
  if(WIFEXITED(stat))
    //normal exit: Delete child from job list
  if(WIFSIGNALED(stat))
    //interrupted by signal: delete job from job list
  if(WIFSTOPPED(stat))
   //Stopped: put child in background
 }
}

//SIGINT Handler:
kill(-pid,sig)

//SIGSTOPPED Handler:
kill(-pid,sig)

ここで、プロセスを実行してバックグラウンド (ctrl z) でループ (100 回) すると、ほとんどの場合、エラーが発生します。waitpid error: Interrupted system call

なぜ私はこれを手に入れたのですか?

4

2 に答える 2

1

中断されたシステム コール:

プロセスが「遅い」システム コールでブロックされている間にプロセスがシグナルをキャッチすると、システム コールが中断されました。

問題は、呼び出しプロセスによって送信されたシグナルの受信により、waitpid 関数が中断されたことです。

waitpid は中断されたシステム コールです。したがって、中断されたシステム コールの問題は、エラー リターンを明示的に処理する必要があることです。

errno を使用して、waitpid のエラーを処理する必要があります。

中断されたシステム コールとは、たとえば、read ステートメントが実行され、read が stdin から入力を読み取り、読み取りの間にシグナルが発生し、システムがそのシグナルを処理する必要があり、読み取りが終了することを意味します。 errno を EINTR に設定します。

于 2015-11-02T10:28:02.273 に答える