C++ における fork 関数の使用法と原理. C++ では、fork 関数は、元のプロセスとほぼ同じ、サブプロセスと呼ばれる新しいプロセスを作成するために使用されます。
fork 関数の基本的な概要
fork() 関数が正常に呼び出されると、2 つの戻り値が返されます。現在のプロセス、つまり親プロセスは子プロセスの pid を返し、子プロセスは 0 を返します。関数呼び出しが失敗した場合は -1 を返します。
#include <stdio.h>
#include <unistd.h>
int main(void) {
int i = 0;
printf("i\tson/pa\tppid\tpid\tfpid\n");
for (i = 0; i < 2; i++) {
pid_t fpid = fork();
if (fpid == 0)
printf("%d\tchild\t%4d\t%4d\t%4d\n", i, getppid(), getpid(), fpid);
else
printf("%d\tparent\t%4d\t%4d\t%4d\n", i, getppid(), getpid(), fpid);
}
return 0;
}
操作結果:
i son/pa ppid pid fpid
i son/pa ppid pid fpid
0 parent 54861 57344 57345
0 child 57344 57345 0
1 parent 54861 57344 57346
1 parent 57344 57345 57347
1 child 57344 57346 0
1 child 57345 57347 0
簡単な分析は次のとおりです。
1. pid 57344 のプロセスの fork() の後、子プロセスの pid である 57345 が返されます。
2. 子プロセスの戻り値は 0 で、明らかにその親プロセスの PID は 57344 です。
3. for ループは実行を続けます。
4. この時点で、pid 56344 のプロセスは、pid 56346 の子プロセスを作成します。
5. この時点では、pid が 56345 の以前の子プロセスが親プロセスとして機能し、pid が 56347 の子プロセスが作成されます。
6. その後、56346と56347の処理が継続して実行され、プログラムが終了します。
fork関数の働き
#include<unistd.h>
pid_t fork(void)
戻り値:pid_t
これはプロセス記述子であり、本質的には one ですint
。fork 関数の呼び出しが失敗した場合は負の数を返し、呼び出しが成功した場合は 2 つの値 (0 と子プロセス ID) を返します。
関数機能: 現在のプロセスを親プロセスとして新しい子プロセスを作成し、親プロセスのすべてのリソースを子プロセスにコピーして、子プロセスが親プロセスのコピーとして存在するようにします。親プロセスと子プロセスはほぼ同一ですが、親プロセスIDと子プロセスIDが異なるなどの違いもあります。
フォーク関数の後
プログラムが単にほぼ同じ新しいプロセスを作成するだけの場合、そのようなプロセスは役に立ちません。したがって、新しい子プロセスを別のプログラムに置き換えることができれば、プロセスを使用してまったく異なる子プロセスを作成することに成功したことになります。プロセスの置き換えについては、ここでは詳しく説明しませんので、後ほど改めて説明します。