成功すると、子プロセスのPIDは親の実行スレッドで返され、0は子の実行スレッドで返されます。
p = fork();
マニュアルページで混乱しています。p
は0
またはPID
と等しいですか?
マニュアルがどのようにもっと明確になるかわかりません! 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
}
p = fork(); /*エラーがないと仮定*/ /*これで2つの*/ /*プログラムが実行されます*/ -------------------- if(p> 0){| if(p == 0){ printf( "parent\n"); | printf( "子\ n"); ... | ...
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つのプロセスを区別できる方法です。
プロセスは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ライブラリ、その他の場合)
これはクールな部分です。 両方に等しい
まあ、そうでもない。しかし、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
}
この場合、両方の文字列が出力されますが、処理は異なります。
Forkは複製プロセスと新しいプロセスコンテキストを作成します。 0の値が返された場合は、子プロセスが実行されていることを意味しますが、別の値が返された場合は、親プロセスが実行されていることを意味します。子プロセスが完了して親プロセスが実行を開始するように、通常はwaitステートメントを使用します。
fork()
は親プロセスで呼び出されます。次に、子プロセスが生成されます。子プロセスが生成されるまでに、fork()
は実行を完了しています。
この時点で、fork()
は戻る準備ができていますが、親または子のどちらにあるかによって異なる値を返します。子プロセスでは0を返し、親プロセス/スレッドでは子のプロセスIDを返します。
私はそれが次のように機能すると思います:pid = fork()の場合、コードは2回実行される必要があります。1つは現在のプロセスにあり、もう1つは子プロセスにあります。したがって、if/elseの両方が実行される理由を説明します。順序は、最初の現在のプロセスであり、次に子を実行します。