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

今天在测试共享内存时编写了一个进程测试的代码,在调用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。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值