c语言 僵尸进程,什么是僵尸进程-僵尸进程讲解-进程在什么情况下会变成僵尸进程-嗨客网...

僵尸进程教程

如果我们了解过

但是如果一个进程已经终止了,但是其父进程还没有获取其状态,那么这个进程就称之为僵尸进程。

僵尸进程还会消耗一定的系统资源,并且还保留一些概要信息供父进程查询子进程的状态可以提供父进程想要的信息,一旦父进程得到想要的信息,僵尸进程就会结束。

案例

创建僵尸进程

我们在 Linux 下使用 vim 新建一个 zombie.c 的文件,编写如下

#include

#include

#include

#include

#include

#include

#include

int main(void){

pid_t pid ;

//signal(SIGCHLD,SIG_IGN);

printf("before fork pid:%d\n",getpid());

int abc = 10;

pid = fork();

if(pid == -1)

{

perror("tile");

return -1;

}

if(pid > 0)

{

abc++;

printf("parent:pid:%d \n",getpid());

printf("abc:%d \n",abc);

sleep(20);

}

else if(pid == 0)

{

abc++;

printf("child:%d,parent: %d\n",getpid(),getppid());

printf("abc:%d",abc);

exit(0);

}

printf("fork after...\n");

}

我们使用 gcc 编译上述程序,具体命令如下:

gcc zombie.c -ozombie

编译完成后,会在当前目录生成一个 zombie 的二进制可执行文件,我们使用 ls 命令,查看,如下:

f5430c7129ec12edc33d1a90b79bee23.png

此时,我们直接运行该二进制文件,输入以下命令:

./zombie

运行成功后,控制台输出如下:

16cb6ab5f1128d42070dd795d35bfdda.png

此时,我们在另一终端,使用 ps 命令,查看当前进程的状态,具体命令如下:

ps -elf | grep zombie

此时,运行后,控制台输出如下:

489861bd3027ffc0b0c1e4c58c7649a1.png

此时,我们可以看到,zombie 进程后面的状态为 defunct,即此时的 zombie 进程即为僵尸进程。

怎么避免僵尸进程

看程序被注释的那句 signal(SIGCHLD,SIG_IGN),加上就不会出现僵尸进程了。

这是 signal() 函数的声明 sighandler_t signal(int signum, sighandler_t handler),我们可以得出 signal 函数的第一个函数是 Linux 支持的信号,第二个参数是对信号的操作 ,是系统默认还是忽略或捕获。

我们这是就可以知道 signal(SIGCHLD,SIG_IGN) 是选择对子程序终止信号选择忽略,这是僵尸进程就是交个内核自己处理,并不会产生僵尸进程。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值