中間発表終了

中間発表が終了した。前回の学科中間発表であまりにも手を抜きすぎていて
やばいと思ったため今回はかなり力を入れた。
それで発表に望んで自分的には会心の出来。

終わったあと打ち上げにいって食いまくり飲みまくり。
自分でもなんであんなに物が食えたのか不思議なくらい。
しかも、店を出てから、自分の腹を見てると体のどの部分より
腹が出てた。破裂しそうな勢いだ。
終わったあと、二次会があるのかと思ってたが、みんな帰ってしまうし
物足りなかったので久しぶりに学科の友達の家に行った。
その友達はずいぶんとがんばっているみたい。資格とか結構取ろうとしてる
みたいだ。その後もう一人友達が来て、朝方まで飲み続けた。

fork()の動作


fork()

fork()
プロセスを新たに生成するには fork() システムコールによる。実は、 $ ps -e で表示されるすべてのプロセスは init から fork によって生成されたものである。
int fork() /* 新しいプロセスを生成 */
/* 成功するとプロセスIDと0を、失敗するとー1を返す */
fork は元のプロセスのクローンを作り出し、新しいプロセスIDを与える。これが、「子プロセス」(child process)である。元のプロセスは消滅するわけではなくて、そのまま、生き続ける。これを、子プロセスに対して「親プロセス」と呼ぶ。
fork()は正常にリターンすると、2つの「返り値」をもつ。1つは0であり、もう1つは「プロセスID」である。ただし、この「返り値」のそれぞれを受け取る親プロセスが受け取る「返り値」が子プロセスのプロセスIDであるということは、「子を生成した親プロセスは子プロセスのことを認識している」(子を作りっぱなしではない)ということである。一方、子プロセスの方も自分がどの親から生まれたかを認識している( getppid() )。

それでは、このことをテストしてみよう。

forktest1.c

#include <stdio.h>
main()
{
int i;

printf("\t(%s)プロセスID..........%d\n","元",getpid());
printf("\t(%s)親プロセスID........%d\n","元",getppid());

if( (i=fork()) == 0 )
/* execute only in CHILD process */
{
printf("\t子プロセスでのfork()の値 : %d\n",i);
printf("\t(%s)プロセスID...........%d\n","子",getpid());
printf("\t(%s)親プロセスID.........%d\n","子",getppid());
}
else
/* execute only in PARENT process */
{
printf("\t親プロセスでのfork()の値 : %d\n",i);
printf("\t(%s)プロセスID...........%d\n","親",getpid());
printf("\t(%s)親プロセスID.........%d\n","親",getppid());
}
}


ipc$ cc forktest1.c
ipc$ a.out
(元)プロセスID..........978
(元)親プロセスID........942
子プロセスでのfork()の値 : 0
(子)プロセスID...........979
(子)親プロセスID.........978
親プロセスでのfork()の値 : 979
(親)プロセスID...........978
(親)親プロセスID.........942
ipc$