进程学习——父进程子进程ID

来源:互联网 发布:视频后期美颜软件 编辑:程序博客网 时间:2024/05/10 02:16
今天在测试共享内存时编写了一个进程测试的代码,在调用fork函数创建子进程时,在父进程中返回子进程pid,在子进程中返回0;具体代码如下:
#include <unistd.h>#include <stdio.h>int main(){    pid_t pid;    pid = fork();    //父进程    if(pid != 0)    {        printf("this is father, child pid = %d\n", pid);    }    //子进程    if(pid == 0)    {        printf("this is child, father pid = %d\n", getppid());    }}

在运行这段程序时出现了下面的结果:
hello@hello-machine:~/study-linux/unix_c/12-mem_share./testthisisfather,childpid=3680thisischild,fatherpid=3679hello@hellomachine: /studylinux/unixc/12memshare ./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

在第二个运行结果中出现了子进程的父进程pid为1的情况,这是因为在fork之后是父进程先执行还是子进程先执行是不确定的,在这个代码中父进程和子进程的内容都是十分简单的;在子进程正常终止时,会将其终止状态返回给父进程,如果父进程在子进程之前终止,则会进行这样的处理呢?对于父进程已经终止的所有进程,它们的父进程都改变为init进程,称这些进程有init进程领养。具体过程为:在一个进程终止时,内核逐个检查所有活动进程,判断它是否是要终止进程的子进程,如果是,则将该进程的父进程ID更改为1(init进程的ID)。这种处理方法保证了每个进程都有一个父进程。
在本文的代码中当父进程先运行结束时,子进程就被init进程领取,这样它的父进程pid就为1。

0 0