目录
- 回顾
- 一 孤儿进程
- 1 孤儿进程代码实现 和 查看
- 二 僵尸进程
- 1 僵尸进程代码实现和查看
回顾
上一节说了 当 调用 execl execlp 函数 时 不用拷贝多余的空间 就可以实现多一个命令(或是多多个命令) 相当于运行一个代码 可以最多实现n个功能 具体还要根据 execl execlp的设定
1 execl 函数可以是有c文件的参数
2 但是 execlp 只能有固定命令参数和命令名字 不能是执行创建的 (hello.c )
比如 ps aux ls -l 就是固定命令参数和命令名字
ls ,ps 就是命令名字 -l aux 就是命令参数
继续往下学
一 孤儿进程
孤儿进程就是 被父进程 抛弃了子进程就出门了 这是子进程就是孤儿进程 最后会人收养它 那就是
养父进程 并且类型就是int的 就是int 进程
必须是父进程才能抛弃子进程 也就是 释放子进程控制块 的意思
父进程抛弃完之后 空间就更多了 也就是进程结束之后 能够释放用户空间的意思
1 孤儿进程代码实现 和 查看
#include
#include
#include
#include
int main()
{
pid_t a;
a=fork();
if(a>0)
{
printf("father pid is %dn",getpid());
}
else if(a==0)
{
sleep(2);
printf("child pid is %d ppid is %d n",getpid(),getppid());
}
return 0;
}
因为父进程是从main开始执行的 所以到了子进程的if判断while sleep(2); 睡眠 2ms
相当于挂起了 退出了
为什么父进程对应不上呢
先查看他的 pid 对应了什么任务
systemd 是int类型的 也就是养父进程
养父进程收养了子进程
二 僵尸进程
父进程一直在工作 却不知道子进程的信息 这时子进程就变僵尸进程了
退出了工作 父进程只能收僵尸的信息了
1 僵尸进程代码实现和查看
#include
#include
#include
#include
int main()
{
pid_t a;
a=fork();
if(a>0)
{
while(1){
printf("father pid is %dn",getpid());
sleep(2);
}
}
else if(a==0)
{
printf("child pid is %d ppid is %d n",getpid(),getppid());
}
return 0;
}
defunct :僵尸进程 和对应的二进制文件
如果杀死 会不会存在
注意不是杀死子进程 而是杀死了父进程 才能让僵尸进程不存在
因为父进程是主导的 子进程是被动的
其实产生僵尸进程 杀死不杀死 都是一个没有生命周期的进程