差分

移動先: 案内検索

プロセス管理

84 バイト追加, 2016年4月10日 (日) 12:33
/* fork(2) */
プロセスの生成は[http://man7.org/linux/man-pages/man2/fork.2.html fork(2)]を使い親プロセスが子プロセスを生み出します。下のコードを見て下さい。
<CODEsyntaxhighlight lang='C' line="1" > #include <unistd.h>  #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> void main(){
pid_t pid, wait_pid;
int wait_stat;
exit(EXIT_SUCCESS);
}
if ( pid == -1 ){ exit(EXIT_FAILURE); }
fprintf(stderr,"pid in parent: %d\n",pid);
wait_pid=wait(&wait_stat);
fprintf(stderr,"wait returns : %d(%o)\n",wait_pid,wait_stat);
exit(EXIT_SUCCESS);
} </CODEsyntaxhighlight >
システムコールfork(2)はフォーク後、親プロセスでは子プロセスのプロセスIDを返却し、子プロセスでは0を返却します。
;補足: プログラム中ではシステムコールexecve(2)よりもライブラリ関数execl(3)などを使う場合の方が多いでしょうが、ここでは説明としてexecve(2) を取り上げています。下のコードは/bin/dateを実行している例です。
 <CODEsyntaxhighlight lang='C' line="1" > 1 #include <unistd.h> 2 main() { 3 if ( fork() == 0 ) { 4 execl("/bin/date","/bin/date",NULL); 5 } wait(); 6 }</CODEsyntaxhighlight
;調べてみよう: カーネルの中でforkをするのはkernel/fork.cの中の関数do_fork です。関数do_forkは関数copy_processを呼び出してプロセスをコピーするのがメインの役割です。関数copy_processは、必要なものを親プロセスからコピーし子プロセス独自に必要な情報を初期化しています。