首页 > 系统相关 >父进程终止,子进程未被init收养问题

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

时间:2023-03-11 14:13:40浏览次数:32  
标签:systemd 1479 pid PID 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进程的情况了。

 

标签:systemd,1479,pid,PID,init,进程,收养
From: https://www.cnblogs.com/shi-zhai/p/17205924.html

相关文章