linuxプロセス制御-fork()
1925 ワード
プロセス構成は、proc構造とusr構造からなる一意のプロセス制御ブロックPCBを有する.次に、プロセス関連のシステム呼び出しについて説明します.1:fork()関数は、サブプロセスを作成します.
forkの名前だけを見ると、何のために使われているのか、めったに推測できる人はいないかもしれません.forkシステム呼び出しの役割は、プロセスをコピーすることです.1つのプロセスが呼び出されると、完了すると2つのほぼ同じプロセスが現れ、新しいプロセスも得られます.forkの名前は、フォークの形に似たワークフローに由来するという.Linuxでは、新しいプロセスを創造する方法は一つしかありません.私たちが紹介しているforkです.システム()のような他のライブラリ関数も、新しいプロセスを作成できるように見えますが、ソースコードを見ると、実際にはforkが内部で呼び出されていることがわかります.コマンドラインの下でアプリケーションを実行することも含めて、新しいプロセスもshell呼び出しforkによって作成されます.forkには興味深い特徴がありますが、次は小さなプログラムでもっと理解してみましょう.
コンパイルおよび実行:
このプログラムを見るとき、まず一つの概念を理解しなければなりません.文pid=fork()の前に、このコードを実行しているプロセスは1つしかありませんが、この文の後、2つのプロセスが実行されているようになります.この2つのプロセスのコード部分は完全に同じで、実行する次の文はif(pid=0).......
2つのプロセスのうち、もともと存在していたものを「親プロセス」と呼び、新しく現れたものを「サブプロセス」と呼ぶ.親子プロセスの違いはプロセスフラグ(process ID)が異なるほか,変数pidの値も異なり,pidはforkの戻り値を格納する.fork呼び出しの奇妙な点は、1回だけ呼び出されたが、2回戻ることができ、3つの異なる戻り値がある可能性があることです.親プロセスでは、forkは新規作成サブプロセスのプロセスIDを返す. サブプロセスでは、forkは0を返します. エラーが発生した場合、forkは負の値を返します.
forkエラーには、(1)現在のプロセス数がシステムで規定された上限に達している場合、errnoの値がEAGAINに設定されている2つの原因がある可能性があります.(2)システムメモリが不足している場合errnoの値がENOMEMに設定される
#include /* pid_t */
#include /* */
pid_t fork(void);
forkの名前だけを見ると、何のために使われているのか、めったに推測できる人はいないかもしれません.forkシステム呼び出しの役割は、プロセスをコピーすることです.1つのプロセスが呼び出されると、完了すると2つのほぼ同じプロセスが現れ、新しいプロセスも得られます.forkの名前は、フォークの形に似たワークフローに由来するという.Linuxでは、新しいプロセスを創造する方法は一つしかありません.私たちが紹介しているforkです.システム()のような他のライブラリ関数も、新しいプロセスを作成できるように見えますが、ソースコードを見ると、実際にはforkが内部で呼び出されていることがわかります.コマンドラインの下でアプリケーションを実行することも含めて、新しいプロセスもshell呼び出しforkによって作成されます.forkには興味深い特徴がありますが、次は小さなプログラムでもっと理解してみましょう.
/* fork_test.c */
#include
#inlcude
main()
{
pid_t pid;
/* */
pid=fork();
/* */
if(pid<0)
printf("error in fork!");
else if(pid==0)
printf("I am the child process, my process ID is %d/n",getpid());
else
printf("I am the parent process, my process ID is %d/n",getpid());
}
コンパイルおよび実行:
$gcc fork_test.c -o fork_test
$./fork_test
I am the parent process, my process ID is 1991
I am the child process, my process ID is 1992
このプログラムを見るとき、まず一つの概念を理解しなければなりません.文pid=fork()の前に、このコードを実行しているプロセスは1つしかありませんが、この文の後、2つのプロセスが実行されているようになります.この2つのプロセスのコード部分は完全に同じで、実行する次の文はif(pid=0).......
2つのプロセスのうち、もともと存在していたものを「親プロセス」と呼び、新しく現れたものを「サブプロセス」と呼ぶ.親子プロセスの違いはプロセスフラグ(process ID)が異なるほか,変数pidの値も異なり,pidはforkの戻り値を格納する.fork呼び出しの奇妙な点は、1回だけ呼び出されたが、2回戻ることができ、3つの異なる戻り値がある可能性があることです.
forkエラーには、(1)現在のプロセス数がシステムで規定された上限に達している場合、errnoの値がEAGAINに設定されている2つの原因がある可能性があります.(2)システムメモリが不足している場合errnoの値がENOMEMに設定される