有两个这样的进程:僵尸进程&孤儿进程,蓝瘦香菇
阅读本文大概需要 5.8 分钟。
来自:https://juejin.im/post/5f20fbeae51d45348675fa78
进程
[root@iz2ze76ybn73dvwmdij06zz ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 5月20 ? 00:00:33 /usr/lib/systemd/systemd --system --deserialize 21
root 2 0 0 5月20 ? 00:00:00 [kthreadd]
root 3 2 0 5月20 ? 00:00:06 [ksoftirqd/0]
root 5 2 0 5月20 ? 00:00:00 [kworker/0:0H]
root 7 2 0 5月20 ? 00:00:02 [migration/0]
root 8 2 0 5月20 ? 00:00:00 [rcu_bh]
root 9 2 0 5月20 ? 00:30:40 [rcu_sched]
root 10 2 0 5月20 ? 00:00:17 [watchdog/0]
root 11 2 0 5月20 ? 00:00:16 [watchdog/1]
root 12 2 0 5月20 ? 00:00:02 [migration/1]
root 13 2 0 5月20 ? 00:00:03 [ksoftirqd/1]
root 15 2 0 5月20 ? 00:00:00 [kworker/1:0H]
root 17 2 0 5月20 ? 00:00:00 [kdevtmpfs]
root 18 2 0 5月20 ? 00:00:00 [netns]
root 19 2 0 5月20 ? 00:00:01 [khungtaskd]
root 20 2 0 5月20 ? 00:00:00 [writeback]
root 21 2 0 5月20 ? 00:00:00 [kintegrityd]
root 22 2 0 5月20 ? 00:00:00 [bioset]
root 23 2 0 5月20 ? 00:00:00 [kblockd]
fork
子进程 :返回值是0,返回0的理由是子进程的父进程是可以唯一确定的,通过getppid方法可以获取到父进程id。 父进程 : 返回的是新创建的子进程的id,因为父进程可以有多个子进程,也没有这样的函数可以获取该线程的子线程的所有id。
#include
#include
#include
int main(int argc, char const *argv[])
{
pid_t p1 = fork();
printf("%d\n",p1);
if(p1 > 0)
{
printf("父进程 pid = %d, p1 = %d\n", getpid(), p1);
}
else
{
printf("子进程 pid = %d , ppid = %d, p1 = %d\n", getpid(), getppid(), p1);
}
return 0;
}
[root@iz2ze76ybn73dvwmdij06zz ~]# ./fork2
10213
父进程 pid = 10212, p1 = 10213
0
子进程 pid = 10213 , ppid = 10212, p1 = 0
孤儿进程
[root@iz2ze76ybn73dvwmdij06zz ~]# cat guer.c
#include
#include
#include
#include
int main()
{
pid_t pid = fork();
if (pid < 0) {
perror("fork error;");
exit(1);
} else if (pid == 0) {
sleep(5);
printf ("子进程 : [ pid] = %d , 父进程 [ppid] = %d\n",getpid(),getppid());
exit(0);
} else if (pid > 0) {
printf("我是父线程,我先退出一步~\n");
exit(0);
}
return 0;
}
危害
僵尸进程
[root@iz2ze76ybn73dvwmdij06zz ~]# cat zombie.c
#include
#include
#include
#include
int main()
{
pid_t pid;
pid = fork();
if (pid < 0)
{
perror("fork error:");
exit(1);
}
else if (pid == 0)
{
printf("我是子进程,我要先退出一步了.\n");
printf("子进程 id : %d\n" ,getpid());
exit(0);
} else {
printf("我是父进程,我先睡2秒\n");
printf("父进程 id : %d\n" ,getpid());
sleep(2);
while(2); //来个死循环,不退出的那种
}
return 0;
}
危害
处理
1.干掉父进程
2.父进程调用wait或waitpid
3.fork两次
4.signal函数
signal(SIGCLD, SIG_IGN) signal(SIGCHLD, SIG_IGN)
总结
推荐阅读:
微信扫描二维码,关注我的公众号
朕已阅
评论