3

それはどういう意味if(!fork())ですか?私はそれについて少し混乱しています、私はいつ親と子のプロセスにいるのかわかりません:

if(!fork())
{
  // is it child or parent process?
}else{
  // is it child or parent process?
}
4

7 に答える 7

12

fork(2)マンページから:

戻り値

成功すると、子プロセスのPIDが親に返され、0が子に返されます。失敗すると、親に-1が返され、子プロセスは作成されず、errnoが適切に設定されます。

子に0を返すためfork()、if句はそれが子であるかどうかをテストします。

if (!fork()) // same as: if (fork() == 0)
{
  // child
}else{
  // parent
}
于 2012-11-21T14:51:07.233 に答える
3

0ブール値であるかのように条件付きで使用できるため、これは次の質問と同じです。

if(fork() == 0) {

ドキュメントには次のように書かれています。

成功すると、子プロセスのPIDが親に返され、0が子に返されます。失敗すると、親に-1が返され、子プロセスは作成されず、errnoが適切に設定されます。

0コーダーが「not 」または0(「true」または「false」)のみを気にする場合、条件付きで整数値を直接使用するのが一般的なイディオムです。

于 2012-11-21T14:50:01.600 に答える
3

の呼び出しは子で0を返すため(もちろん、機能する場合)、ステートメントforkの真の(最初の)部分がそこで実行されます(真であるため)。if!0

forkfalse(2番目)の部分は、成功する(子のPIDを返す)か失敗する(戻る)かにかかわらず、親で実行されます-1

すべてのエッジケースを考慮しているわけではないので、私はこの特定の方法の大ファンではありません。私は次のようなものが好きです:

pid_t pid = fork();
switch (pid) {
    case -1: {
        // I am the parent, there is no child, see errno for detail.
        break;
    }
    case 0: {
        // I am the child.
        break;
    }
    default: {
        // I am the parent, child PID is in pid, eg, for waitpid().
        break;
    }
}

この設定により、情報を失うことなく、何が起こっているのかを正確に把握できます。

于 2012-11-21T14:50:54.500 に答える
1

if(!fork())
{
  /*  its child, as child would only be created on success and return 0 which would have been turned into true by ! operator */
}else{
  /* it is parent because either success or failed, fork would have returned nonzero value and ! would have made it false */
}

于 2012-11-21T14:53:42.953 に答える
1

そのコードはフォークからのエラーをチェックしません!すでに実行されているプロセスが多すぎる場合、または十分なメモリフォークがない場合、失敗し、ソフトウェアはおそらく非常に奇妙な方法で動作します。

于 2012-11-21T15:58:36.680 に答える
0

してくださいman fork、あなたはそれについてもっと知るでしょう。それは実際に戻っpid_tてきますint

正常に返されると0、子プロセスには正の値、親プロセスには正の値が与えられます

実際にはこのようなものです:

pid_t pid;
pid=fork();

if(pid <0)
{
 printf("fork failed");
 return -1;
}
else if(pid == 0) 
{
  it  is child process
}
else
{
  It is parent process
}

つまり、条件が真であり、内部のステートメントを実行する場合、それは間違いなくif(!fork())意味します。child process!0 == 1if(!fork())

于 2012-11-21T14:49:40.783 に答える
0

の値は次のfork()とおりです。

  • 0、これは子供であることを意味します

  • <0、これはエラーです

  • > 0親、つまり親です

if (!fork())は短い書き方なのでif (fork() == 0)、次のことを意味します。

if(!fork()) {
  // it is a child process
}
else {
  // it is a parent process
}
于 2012-11-21T14:52:28.140 に答える