linuxプロセス制御-fork()

1925 ワード

プロセス構成は、proc構造とusr構造からなる一意のプロセス制御ブロックPCBを有する.次に、プロセス関連のシステム呼び出しについて説明します.1:fork()関数は、サブプロセスを作成します.
	#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は新規作成サブプロセスのプロセスIDを返す.
  • サブプロセスでは、forkは0を返します.
  • エラーが発生した場合、forkは負の値を返します.

  • forkエラーには、(1)現在のプロセス数がシステムで規定された上限に達している場合、errnoの値がEAGAINに設定されている2つの原因がある可能性があります.(2)システムメモリが不足している場合errnoの値がENOMEMに設定される