0

重複の可能性:
fork()が2つの値を返すことはどのように可能ですか?

私はCを初めて使用し、fork()関数の戻り値の構造について混乱しています。

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

int main(){
  pid_t childPid;
  childPid = fork();
  printf("%d\n",childPid);
  return EXIT_SUCCESS;
}

出力は次のとおりです。

28501
0

pid_tは型なのでint、2つの値はどのようにありchildPidますか?

4

2 に答える 2

7

実際には、実行可能ファイルの2つのコピーの出力が表示されています。を呼び出すfork()と、プロセスはそれ自体を複製し、2つのプロセスを提供します。親は子プロセスのPIDを戻り値として取得し、子は0を戻り値として取得します。

秘訣は、クローンがSTDIN、STDOUT、およびSTDERRを共有することです。親がprintfに到達すると、子と同様に、親が持っていた値を出力するため、両方のプロセスが同じSTDOUTを共有している、両方のPIDが表示されます。プログラムでそれらを区別する明確な方法はありません。

次のように書き直してみてください。

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

int main(){
  pid_t childPid;
  childPid = fork();
  if(childPid != 0)
      printf("I'm the parent and my child PID is %d\n",childPid);
  else
      printf("\tI'm the child, so I received  %d\n",childPid);

  return EXIT_SUCCESS;
}

これがよりはっきりとわかります。

追加のクレジットについては、wait()syscallを確認し、それを使用して、子の後に親を終了させます。

于 2012-08-06T04:02:35.443 に答える
6

成功forkすると、親(forker)と子の2つのプロセスができます。新しく作成されたプロセスである子は、の戻り値を取得します0。これはそれが子供であるという合図です。

つまり、親プロセスが子の実際のpidを印刷し、子プロセスが印刷しているのがわかります0。あなたの質問に何かが欠けていない限り、これは期待どおりに機能していますか?

于 2012-08-06T04:02:37.237 に答える