2017-09-16 13 views
-2

私は、関数のforkが返す値について少し混乱しています。私は値0childのプロセスであり、値>0parentのプロセスであることを理解しています。 Iはフォーク後Cの変数にforkのreturnin値を保存する

int main() 
{  
    int pid; 
    pid = fork(); 
    if(pid == 0) 
     //DO SOMETHING 
    else 
     //DO SOMETHING ELSE 
    return 0; 
} 

valiable pid以下のコードは、プロセスごとに異なるがありますか? 値がどのように切り替わるのか分かりません。そして、私は子供の価値を持っている理由は、PID最初printfとの行に私は理解していない可能性のあるコード

int main() 
{ 
    int pid; 
    if (pid == 0) 
    { 
      return 5; 
    } 
    printf("parent = %d waits for child = %d ", getpid(), pid); 
    waitpid(pid, NULL, 0); 
    printf("child terminates!") 
    return 0; 
} 

を有する第2の部分を持っています。親のidであってはなりませんか?

答えて

0

フォーク後の有効なPIDはプロセスごとに異なりますか?

はい、これは戻り値として取得する新しいプロセスIDです。同じIDを持つ同じプロセスが同時に存在することはできません。したがって、いつでもあなたがフォークするたびにユニークなIDを取得してください。

プロセスは、すべての可変メモリの内容(ヒープ、スタック、データセグメント)のコピーを含めて、依然としてfork()コール内にクローンされます。コピーが完了すると、カーネルは両方のプロセスの実行を再開しますが、異なる戻り値を返します。

ここでは、最初のprintfのpidが子供の値を持つ理由を理解できません。それは親のIDであってはなりませんか?

getpid()は、現在実行中のコンテキストであるため、親のIDを返します。 pidはその例ではガベージ(初期化されていないメモリ)なので、あなたが見ていると思っているものは、プロセスIDではなくランダムなメモリ内容です。

+0

2番目の質問では、 'pid'はプロセスIDではないと言います。しかし、親プロセスはwaitpid()を使用して子プロセスの待機を待っています。なぜプロセスIDではないのですか? –

+0

@DimitrisMplスタックに割り当てられた整数変数で、初期化されていません。同じ名前でも、他の関数で使用したのと同じ 'pid'変数ではありません。それで、最後にスタックに書き込まれたものだけが含まれます。 – Ext3h

関連する問題