子进程与父进程的关系,简单概括为:
子进程继承了父进程的内容,但父子进程有独立的地址空间,两者之间的运行互不影响
根据子进程和父进程的先后结束关系,有两种情况:
- 父进程先结束,子进程成为孤儿程序会被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