父进程终止,子进程未被init收养问题

子进程与父进程的关系,简单概括为:

子进程继承了父进程的内容,但父子进程有独立的地址空间,两者之间的运行互不影响

根据子进程和父进程的先后结束关系,有两种情况:

  • 父进程先结束,子进程成为孤儿程序会被init进程收养,子进程变为后台程序
  • 子进程先结束,父进程如果没有及时使用wait()回收,子进程会变为僵尸程序,造成内存资源的浪费

对于父进程先结束,子进程被收养,其实也是为了避免出现僵尸程序,使子程序能够在后台运行完成后将内存资源回收。

编写代码如下进行测试。

#include <stdio.h>
#include <unistd.h>

int main(){
    pid_t pid;
    pid = fork();
    if(pid < 0){
        perror("fork");
        return 0;
    }else if(pid == 0){
        printf("I am a deamon\n");
        sleep(100);            //确保父进程结束前,子进程未结束
    }else{
        printf("child PID is %d\n",(int)pid);    //fork()创建成功返回子进程PID
            exit(0);        //结束父进程
    }

    return 0;
}

运行后根据使用ps对进程的属性进行查看,得到结果

ps -elf|grep mydae

发现子进程在父进程结束以后被PID为1479的进程收养,而不是PID为1的init进程收养。

通过查找1479进程,得到结果为1479进程为systemd(不是1479进程就是systemd,systemd的PID就一定是1479,只是本次运行两者相互对应)

查找原因,了解到在新版的linux系统中(本人使用ubuntu22.10),使用systemd作为最新的初始化系统(init)来提高系统的启动速度。

即:使用了systemd来完成部分init进程的工作,也就出现了未结束的子进程被分配给systemd进程的情况了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值