3

誰かが私に何を意味するのか説明してもらえますfork() != 0か? 私が理解していることから、フォークが偽でない場合、それは意味すると思いますか? または、 fork が true の場合.... Fork() が true または false になる方法がわかりません。プロセスのコピーを親と子に作成するだけなので。また、プログラムがどこにあるとif (Fork() == 0)したら、それはどういう意味ですか?

 #include "csapp.h"

 int main(void)
 {
     int x = 3;

     if (Fork() != 0)
         printf("x=%d\n", ++x);

     printf("x=%d\n", --x);
     exit(0);
 }
4

6 に答える 6

6

fork()失敗した場合は -1 を返し、成功した場合は、フォークされた子の pid を親に返し、子に 0 を返します。したがってif (fork() != 0)、それが親プロセスであるかどうかをテストします。

于 2012-09-14T19:03:28.453 に答える
3

別の方法で説明してみましょう...関数が開始すると、1つのプロセスがあり、このプロセスはint x=3になります。

このコード行に到達すると、次のようになります。

if (fork() != 0)

ここで、fork()が機能したと仮定すると、2つのプロセスがあります。それらは両方とも同じ実行スペースを持っており、両方とも同じコードを(ある程度まで)実行しますが、子はそれ自身のコピーを取得しxて遊ぶことができます。

fork()は子プロセスに0を返すため、子プロセスの見通しから、残りの関数は次のようになります。

printf(("x=%d\n", --x);
exit(0);

一方、親プロセスはfork()コマンドから有効な値を取得するため、次のように実行されます。

printf("x=%d\n", ++x);
printf("x=%d\n", --x);
exit(0);

この時点での出力は誰かの推測です...親または子が最初に実行されるかどうかはわかりません

ただし、親が次の操作にヒットすると仮定すると++x、出力は次のようになります。

x=4
x=3
x=2

親と子の両方がヒットするので--x。(親のxは++ xの後に4で、最後に3になります。子のxは3になり、最後に2になります)

于 2012-09-14T19:36:45.857 に答える
3

マンフォークから

戻り値

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

成功すると、親で 1 回、子で 1回の 2 回fork返されます。


csapp.hOK、私は OP を不利益にしました。どこから来たのかはわかりませんが、それがこれである場合、それはあなたに何の恩恵も与えていません。POSIX の薄いラッパーだと思いますが (例: around fork())、他のプラットフォームでも動作するのでしょうか?

あなたがfork()Fork()に言ったので、後者はタイプミスだと思いましたが、実際にはライブラリ関数です。

直接使用していた場合はfork()、マンページを確認することを期待するのが妥当でしょう。いくつかのライブラリが提供する関数を使用しているためFork()、そのライブラリは実際にそれを文書化する必要があり、そうではないようです。


標準 (非csapp ) の使用法は次のとおりです。

pid_t child = fork();
if (child == -1) {
    printf("fork failed - %d - %s\n", errno, strerror(errno));
    exit(-1);
}
if (child) {
    printf("I have a child with pid %d, so I must be the parent!\n", child);
} else {
    printf("I don't have a child ... so I must be the child!\n")
}
exit(0);
于 2012-09-14T19:05:35.737 に答える
2

fork() マニュアルから:

Upon successful completion, fork() returns a value of 0 to the child process and returns the process ID of the child process to the parent
     process.  Otherwise, a value of -1 is returned to the parent process, no child process is created, and the global variable errno is set to indi-
     cate the error.

コードの実行後、2 つの実行スレッドがあります。if ステートメントには親プロセスのスレッドがあり、else ステートメントには子プロセスのスレッドがあります。

if ( fork() ) { 
    printf("I am the parent!\n"); 
} else {
    printf("I am the child\n");
}

編集

明確にするために: fork は、スレッド、メモリを持ち、他のリソースを持つプロセスを開始します。「スレッド」という言葉を追加して、実行の流れを強調しようとしました (成功しなかったようです)。しかし、決して「親」が「親プロセスのスレッド」の「スレッド」に関連しているとは言えません。

もちろん、私の答えは改善される可能性がありますが、ここにはすでに十分な良い答えがあると思います。

于 2012-09-14T19:04:21.593 に答える
1

次の3つの結果が考えられるため、ifをに置き換えることをお勧めします。switch

#include <sys/types.h>
#include <unistd.h>

pid_t pid;

switch ((pid = fork ())) {
case -1: /* error creating child. */
  break;
case 0:  /* I am the child process. */
  break;
default: /* I am the parent process. */
  break;
}
于 2012-09-14T19:37:10.390 に答える
1

Fork は、子プロセスの場合は 0 を返し、子プロセスのプロセス ID を親プロセスに返します。したがって、通常、コードには if(fork){ }else コードがあります。これは、if 内のコードが親でのみ実行されることを意味します。

それに対処するより良い方法は、

 pid = fork()
 if(pid){
  // I am parent. Let us do something that only the parent has to do
 }else{
 // I am child. Let us do something only the child has to do
 }
 // This code is common to both

子 pid は、後で待機したり、親から切り離したりするのに役立つ場合があります。

于 2012-09-14T19:04:11.180 に答える