2017-01-01 7 views
0

フォークシステムコールを使用してプロセスを作成し、子プロセスを待機させようとしています。私は以下を使用しました:linuxシステムコールウェイトを使用したプロセス待機

waitpid(pid、&ステータス、0);

1)最初の問題は、ステータスが8ビット左にシフトされているなどです。たとえば、子プロセスが1を返した場合、waitpid関数はステータス変数のステータス値を256に戻します。なぜそれをやっているのですか?

2)マニュアルに従って、waitpidは、子プロセスが状態を変更するのを待ちます。しかし、それにも書かれています:

「待機()システムコールは終了コール待ち(&ステータス) に相当し、その子の 1まで、呼び出しプロセスの実行を一時停止:。

のwaitpid( - 1、&ステータス、0); "

ここでは、waitpidとwait呼び出しが状態の変更または子プロセスの終了を待つかどうか、少し混乱しています。親切にこの点を明確にしてください。

第3引数のゼロは何を指定しますか?

3)子プロセスをスリープ状態にすると、子プロセスの状態は、例えば5秒待って待機状態に変化しないのですか?

int main(int argc, char ** argv) 
{ 
pid_t pid = fork(); 
pid_t ppp; 

if (pid==0) 
{ 
    sleep(8); 
    printf ("\n I am the first child and my id is %d \n", getpid()); 
    printf ("The first child process is now exiting now exiting\n\n"); 
    exit (1); 
} 

else { 
      int status = 13; 
      printf ("\nI am now waiting for the child process %d\n", pid); 
      waitpid (pid, &status, 0); 
      printf ("\n the status returned by the exiting child is %d\n", status>>8); 
     } 

printf("\nI am now exiting"); 
exit(0); 

}

おかげ

答えて

1

statusパラメータは子供のちょうど終了コードよりも多くのエンコード:後

は私のプログラムです。真を返す

WIFEXITED(status)
子供はつまり、exit(3)または_exit(2)を呼び出すことによって、またはmain()から返すことによって、正常に終了した場合:man waitpidから。
WEXITSTATUS(status)
は、子の終了ステータスを返します。これは、子がexit(3)または_exit(2)への呼び出しで指定したステータス引数の最下位8ビットまたはreturnステートメントの引数としてmain()で構成されます。このマクロは、WIFEXITEDがtrueを返す場合にのみ使用してください。

main waitpidは、3番目のパラメータの機能を説明しています。

オプションの値は、次の定数の0個以上のORである:子が終了していない場合
WNOHANG
はすぐに戻り 。
WUNTRACED
子供が停止している(ただし、ptrace(2)で追跡されていない)場合も戻ります。このオプションが指定されていなくても、停止しているトレースされた子プロセスのステータスが提供されます。
WCONTINUED(Linux 2.6.10以降) また、停止した子がSIGCONTの配信で再開された場合にも返されます。

状態の変更は非常に正確かつ狭義に定義されています。からman waitpid

状態の変化は次のように考えられます。子供はシグナルによって止められた。または子供は信号によって再開された。

睡眠には状態変化がありません。停止しているのはSIGSTOP/SIGTSTPです。

関連する問題