fork() は、Linux やその他の Unix 系システムにおける非常に重要なシステム コールです。新しいプロセスを作成するために使用されます。この新しいプロセスは、子プロセスと呼ばれる、現在のプロセスのコピーです。子プロセスは親プロセスのコード、データ、ヒープ、スタックなどのコピーを取得しますが、2 つのプロセスは異なるプロセス ID と、開いているファイル記述子などのその他のリソースを持ちます。
fork()関数の基本的な使い方と注意点は以下のとおりです。
関数プロトタイプ
#c
#include <unistd.h> pid_t fork(void);
#戻り値
#親プロセスで fork() の呼び出しが成功すると、新しく作成された子プロセスのプロセス ID が返されます。fork() が子プロセスで正常に呼び出された場合は、0 が返されます。
fork() 呼び出しが失敗した場合は、-1 が返されます。
特徴
親子プロセス: fork() を呼び出すプロセスは親プロセスであり、新しく追加されたプロセスは作成されたプロセスが子プロセスになります。データ コピー: 親プロセスのデータ (コード、ヒープ、スタックなどを含む) は子プロセスにコピーされますが、2 つのプロセスは独立したアドレス空間を持ちます。
非同期性: fork() が子プロセスを作成した後、親プロセスと子プロセスは非同期で実行され、相互に独立して実行できます。
プロセス ID: 各プロセスには一意のプロセス ID (PID) があり、子プロセスの PID は親プロセスの PID とは異なります。
#例
c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { pid_t pid; pid = fork(); if (pid < 0) { // fork 失败 fprintf(stderr, "Fork failed\n"); exit(1); } else if (pid == 0) { // 子进程 printf("I am the child process, my PID is %d\n", getpid()); } else { // 父进程 printf("I am the parent process, my PID is %d, my child's PID is %d\n", getpid(), pid); } return 0; }注
リソースのコピー: fork() は親プロセスのすべてのリソースをコピーします。これにより、特に大規模な環境ではパフォーマンスの問題が発生する可能性があります。プログラム。したがって、不必要なリソースのコピーを避けるために、通常は exec() 一連の関数を使用して fork() の後の子プロセスのコードを置き換えることをお勧めします。
競合状態: 親プロセスと子プロセスは非同期で実行されるため、競合状態が発生する可能性があります。たとえば、2 つのプロセスが同時に同じファイルにアクセスまたは変更しようとすると、データの不整合が生じる可能性があります。
エラー処理: fork() を呼び出した後は、考えられるエラー条件を処理するために、その戻り値を常にチェックする必要があります。
一般に、fork() は Linux システムの非常に基本的かつ重要なシステム コールであり、新しいプロセスを作成するために使用されます。ただし、その複雑さと潜在的なパフォーマンスの問題のため、使用する場合は細心の注意が必要です。
以上がLinuxのfork機能を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。