差分

移動先: 案内検索

プロセス管理

31 バイト除去, 2010年10月28日 (木) 08:07
/* fork(2) */
プロセスの生成はfork(2)を使い親プロセスが子プロセスを生み出します。下のコードを見て下さい。
1 #include <unistd.h>  #include <stdlib.h> #include <sys/types.h> 2 #include <unistdsys/wait.h> 3 #include <stdio.h> 4 void main() { 5 char *p pid_t pid, wait_pid; 6 fprintf(stderr,"we are here\n",p) int wait_stat; 7 if ( (pid = fork() !) == 0 ) { 8 p="parent" sleep(3); 9 fprintf(stderr,"pid in child: %s is hered\n",ppid); exit(EXIT_SUCCESS); 10 } 11 else { 12 pif ( pid ="child"= -1 ){ exit(EXIT_FAILURE);} 13 fprintf(stderr,"pid in parent: %s is hered\n",ppid); 14 } 15 wait_pid=wait(&wait_stat); 16 fprintf(stderr,"wait returns : %s finishd(%o)\n",pwait_pid,wait_stat); exit(EXIT_SUCCESS); 17 }
システムコールfork(2)はフォーク後、親プロセスでは子プロセスのプロセスIDを返却します。フォークができな時ははフォーク後、親プロセスでは子プロセスのプロセスIDを返却し、子プロセスでは0を返却します。またフォークができない時は-1を返却します。子プロセスの時は0を返却します。wait1を返却します。wait(2)は子プロセスの終了を待つシステムコールです。このプログラムを実行すると次のような出力になりますは子プロセスの終了を待つシステムコールです。このプログラムを実行すると次のような出力になります。
$ ./a.out
here we are pid in parent is here: 5008 pid in child is here: 0 child finishwait returns : 5008(0) parent finish
最初は親も子もない1つのプロセスで"here we are"を出力しますが、fork最初は1つのプロセスですが、システムコールfork(2)の時点で、2つのプロセスが出来ます。子プロセスは親プロセスのコピーで、そのまま子プロセス側の処理を行います。この時点で"child is here"が出力されます。waitを呼び出した時点で、エラーが発生しない限り2つのプロセス、つまり親と子のプロセスになります。子プロセスは親プロセスのコピーで、そのまま子プロセス側の処理を行いますがsleep(2)の部分では子プロセスは待つべきプロセスは存在しませんから、そのまま通過し"child finish"が出力されます。があるので一旦スリープします。  親プロセスは、親プロセス側の処理を行い親プロセスはそのまま続行していますから(そしてsleepしていませんから)、"pid in parent is here: ~ "が出力されます。その下のwait(2)では子プロセスがあるので、その終了を待つ状態になります。子プロセスが終了した時点でwait(2)は処理され、次の"parent finish"の行に続きます。  ポインタpを見てみましょう。親プロセスと子プロセスに別れた後は、各々のプロセス中で別々に存在し違う値をもっていていることに注意してください。   here we are | V 親プロセス 子プロセスを出力します。 forkシステムコールwait(2) ---------+ 生成は子プロセスの終了を待つ機能です。そして、まだ子プロセスは終了していませんから、子プロセスの終了を待ちます。 V | parent is here V | 子プロセスはsleepの待ち時間が過ぎれば"pid in child is here:~"を出力して終了します。 | V親プロセスでは子プロセスが終了したのでwaitが終了した子プロセスのidを返却します。 V child finish 親プロセスは"wait()<-------- + 消滅 V parent finish returns : ~"を出力して終了します。
子プロセスが新しい実行ファイルを動かすにはシステムコールexecve新しいコマンドを動かすのもforkを使い子プロセスを生成します。具体的には子プロセスが新しい実行ファイルを動かすにはシステムコールexecve(2)使います。これは、子プロセスの資源を新しい実行ファイルの資源として与えるものです。
匿名利用者