プロセスラーニング-親プロセスサブプロセスID

1727 ワード

 , fork , pid, 0; :
#include 
#include 

int main()
{
    pid_t pid;
    pid = fork();

    // 
    if(pid != 0)
    {
        printf("this is father, child pid = %d
"
, pid); } // if(pid == 0) { printf("this is child, father pid = %d
"
, getppid()); } }

このプログラムを実行すると、次の結果が表示されます.hello@hello-machine:~/study-linux/unix_c/12-mem_share ./testthisisfather,childpid=3680thisischild,fatherpid=3679hello@hello−machine: /study−linux/unixc/12−memshare ./test this is father, child pid = 3682 this is child, father pid = 1 hello@hello-machine:~/study-linux/unix_c/12-mem_share$ ./test this is father, child pid = 3685 this is child, father pid = 3684
2番目の実行結果にサブプロセスの親プロセスpidが1の場合、forkの後に親プロセスが先に実行されるか、サブプロセスが先に実行されるかは不確定であり、このコードでは親プロセスとサブプロセスの内容は非常に簡単である.子プロセスが正常に終了すると、その終了ステータスが親プロセスに返されます.親プロセスが子プロセスの前に終了すると、このような処理が行われますか?親プロセスが終了したすべてのプロセスについて、親プロセスはinitプロセスに変更され、これらのプロセスにはinitプロセスが養子縁組されていると呼ばれます.具体的には、1つのプロセスが終了すると、カーネルはすべてのアクティブなプロセスを1つずつチェックし、プロセスを終了するサブプロセスであるかどうかを判断し、もしそうであれば、そのプロセスの親プロセスIDを1(initプロセスのID)に変更します.この処理方法は、各プロセスに親プロセスがあることを保証します.本明細書のコードでは、親プロセスが先に実行されると、子プロセスはinitプロセスによって受信され、親プロセスpidは1になります.