web-dev-qa-db-ja.com

フォークは正確には何を返しますか?

成功すると、子プロセスのPIDは親の実行スレッドで返され、0は子の実行スレッドで返されます。

p = fork();

マニュアルページで混乱しています。p0またはPIDと等しいですか?

22
compiler

マニュアルがどのようにもっと明確になるかわかりません! fork()は新しいプロセスを作成するため、2つのidenticalプロセスが作成されます。それらを区別するために、fork()の戻り値は異なります。元のプロセスでは、子プロセスのPIDを取得します。子プロセスでは、0を取得します。

したがって、標準的な使用法は次のとおりです。

p = fork();
if (0 == p)
{
    // We're the child process
}
else if (p > 0)
{
    // We're the parent process
}
else
{
    // We're the parent process, but child couldn't be created
}
51
 p = fork(); 
/*エラーがないと仮定*/
/*これで2つの*/
/*プログラムが実行されます*/
 -------------------- 
 if(p> 0){| if(p == 0){
 printf( "parent\n"); | printf( "子\ n"); 
 ... | ... 
29
pmg

forkが実行されると、2つのプロセスがあります。呼び出しは、各プロセスに異なる値を返します。

このようなことをすると

int f;
f = fork();
if (f == 0) {
  printf("I am the child\n");
} else {
  printf("I am the parent and the childs pid is %d\n",f);

}

両方のメッセージが印刷されます。それらは2つの別々のプロセスによって印刷されています。これは、作成された2つのプロセスを区別できる方法です。

8
Noufal Ibrahim

プロセスはdirected treeで構造化されており、単一親(getppid())のみを知っています。要するに、fork()は他の多くのシステム関数と同様にエラー時に_-1_を返します。ゼロ以外の値は、fork呼び出しの開始者(親)が新しい子pidを知るのに役立ちます。

例ほど優れたものはありません。

_/* fork/getpid test */
#include <sys/types.h>
#include <unistd.h>     /* fork(), getpid() */
#include <stdio.h>

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

    printf("Entry point: my pid is %d, parent pid is %d\n",
           getpid(), getppid());

    pid = fork();
    if (pid == 0) {
        printf("Child: my pid is %d, parent pid is %d\n",
               getpid(), getppid());
    }
    else if (pid > 0) {
        printf("Parent: my pid is %d, parent pid is %d, my child pid is %d\n",
               getpid(), getppid(), pid);
    }
    else {
        printf("Parent: oops! can not create a child (my pid is %d)\n",
               getpid());
    }

    return 0;
}
_

そして結果(この場合、bashはpid 2249です):

_Entry point: my pid is 16051, parent pid is 2249
Parent: my pid is 16051, parent pid is 2249, my child pid is 16052
Child: my pid is 16052, parent pid is 16051
_

親と子の間でいくつかのリソース(ファイル、親pidなど)を共有する必要がある場合は、clone()を参照してください(GNU Cライブラリ、その他の場合)

8
levif

これはクールな部分です。 両方に等しい

まあ、そうでもない。しかし、forkが返されると、これでプログラムの2つのコピーが実行されます! 2つのプロセス。あなたはそれらを別の宇宙として考えることができます。 1つは、戻り値は0。もう1つは、新しいプロセスのIDです。

通常は次のようになります。

p = fork();
if (p == 0){
    printf("I am a child process!\n");
    //Do child things
}
else {
    printf("I am the parent process! Child is number %d\n", p);
    //Do parenty things
}

この場合、両方の文字列が出力されますが、処理は異なります。

4
Chris Cooper

Forkは複製プロセスと新しいプロセスコンテキストを作成します。 0の値が返された場合は、子プロセスが実行されていることを意味しますが、別の値が返された場合は、親プロセスが実行されていることを意味します。子プロセスが完了して親プロセスが実行を開始するように、通常はwaitステートメントを使用します。

1
mannukaushikece

fork()は親プロセスで呼び出されます。次に、子プロセスが生成されます。子プロセスが生成されるまでに、fork()は実行を完了しています。

この時点で、fork()は戻る準備ができていますが、親または子のどちらにあるかによって異なる値を返します。子プロセスでは0を返し、親プロセス/スレッドでは子のプロセスIDを返します。

1
BoltClock

私はそれが次のように機能すると思います:pid = fork()の場合、コードは2回実行される必要があります。1つは現在のプロセスにあり、もう1つは子プロセスにあります。したがって、if/elseの両方が実行される理由を説明します。順序は、最初の現在のプロセスであり、次に子を実行します。

0
arswt