2016-10-11 7 views
0

私はlinuxとcのプロセスが初めてです。 (child_pid_or_zero> 0)親cのwait()の目的

何が起こるならば、私は待機を省略する

で()メソッドであれば

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main(int argc, const char * argv[]) { 

pid_t child_pid_or_zero = fork(); //fork returns twice 

if(child_pid_or_zero < 0) 
{ 
    //if fork returns a number smaller than zero, something wrong happened 
    perror("Something wrong happened\n"); 
    exit(-1); 
} 

if(child_pid_or_zero > 0) 
{ 
    //if fork returns a number greater than zero, this is the parent process 
    printf("I'm the parent, my pid is: %d\t My child pid is %d\n", getpid(), child_pid_or_zero); 
    wait(NULL); 
} 

else 
{ 
    //this means that fork now returned 0, the child process is running 
    printf("I am the child with pid: %d\t My parent pid is: %d\n",child_pid_or_zero, getppid()); 

} 


return 0; 
} 

:私はこの簡単な例を使用しています ?私はこれを自分で試しました。明らかに、すぐに違いはありませんでした。私たちは常にwait()を使用する必要がありますか?これは、子供が重い計算などを行うことになっている場合にのみ適用されますか?

ありがとうございます。

+0

https://en.wikipedia.org/wiki/Orphan_process –

+0

http://stackoverflow.com/questions/23709888/how-to-use-wait-in-c – SMW

+0

コンパイル時には、常にすべての警告を有効にし、それらの警告を修正してください。読みやすさと理解を容易にするために – user3629249

答えて

4

待機は、状態の変化を聞き、子供に関する情報を得ることです。状態の変化は、信号による子の終了、停止または再開です。待機は、システムが子に関連するリソースを解放することを可能にする。待機が実行されない場合、終了した子は「ゾンビ」状態のままである。

カーネルは親が後で子供についての情報を取得するために待機を実行することを可能にするためにゾンビ プロセス(PID、終了ステータス、 リソース使用状況の情報)に関する情報の最小セットを保持しています。ゾンビとしての は、 waitを経由してシステムから削除されないので、カーネルプロセステーブルのスロットを消費し、このテーブルがいっぱいになると、さらに プロセスを作成することはできなくなります。親プロセスが終了すると、 "ゾンビ"の子(もしあれば)がinit(1)によって採用され、ゾンビを削除する待機が自動的に実行されます。

+0

正しくはありません。 1)再起動以外のゾンビを殺すことはできません。 2) 'init'プロセスは' wait() 'を実行しないので、ゾンビは永遠に、または再起動するまで – user3629249

+0

ゾンビプロセスが作成されます。 )それを削除することはできません。ゾンビは 'init'プロセスの子になり、永遠に残ります – user3629249

2

通常、子プロセスの状態が変更されたかどうか(つまり、実行中か終了しているかなど)を見つけるためにシステムコールwait(2)が使用されます。

もう1つの目的は、プロセスを回避することです。"zombie"プロセス。親プロセスが子プロセスを待機せず、子プロセスが親プロセスより先に終了した場合、それは「ゾンビ」プロセスになります。したがって、wait()呼び出しは、プロセスを "reap"し、プロセスに関連するシステム・リソースを解放するために使用されます。

親プロセスが長時間実行されていて、一定の間隔で複数の子プロセスを作成した場合、すべてのゾンビプロセスは、システムリソースの不必要な使用であるプロセステーブルにエントリを持ちます。

+0

もう少し詳しく説明できますか?これがこれらのゾンビを導く可能性がある例を提供するように? – Koen

+1

あなたの例ではとても簡単です。親プロセス( 'if hild_pid_or_zero> 0)'の部分)では、最初のステートメントとして 'sleep(10);'を追加します。そしてあなたのコードを実行し、端末の別のウィンドウで 'ps -af'を実行すると、ゾンビプロセスが表示されます(親がまだ取得しておらず、子プロセスが既に終了しているため)。 – usr

1

フォークの後、2つの独立したプロセスがあります。

whit wait()を呼び出すと、親プロセスに子プロセスの終了を待つように指示します。

この例では、2つのプロセスが相互に作用していないため、何も変化しないため、親は子を作成して文字列を印刷した後に終了することができますが、いくつかの操作をし、親にいくつかの値を返すかもしれない、それは便利になります!