免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2226 | 回复: 6

[Linux] 为何子进程成了僵尸进程? [复制链接]

论坛徽章:
0
发表于 2015-11-16 20:15 |显示全部楼层
写了一个父子进程通过信号通信的代码,可是一运行程序,子进程就成了僵尸进程,为何?
代码如下:
#include<stdio.h>
#include<signal.h>

void sig_func(int signo, siginfo_t s_info, void *p_info) {
        char *ptr = NULL;

        ptr = s_info.si_value.sival_ptr;
        printf("capature signo:%d, msg:%s\n", signo, ptr);       
}

int main(int argc,char *argv[]){
        pid_t pid = 0;
        pid_t ppid = 0;
        char *ptr = "Hello,signal";
        struct sigaction sa;
        union sigval s_val;

        ppid = getpid();
        printf("parent pid = %d\n", ppid);       
        pid = fork();

        if (pid < 0) {
                printf("fork error\n");
        } else if (pid == 0) {
                printf("This is child process\n");
                sigemptyset(&sa.sa_mask);
                sa.sa_flags = SA_SIGINFO;
                sa.sa_sigaction = sig_func;
                sigaddset(&sa.sa_mask, SIGQUIT);
                sigprocmask(SIG_BLOCK, &sa.sa_mask, NULL);
                sigaction(SIGINT, &sa, NULL);
                sigaction(SIGUSR1, &sa, NULL);
                sigaction(SIGQUIT, &sa, NULL);
        } else {
                printf("child pid = %d\n", pid);
                printf("This is parent process\n");
                s_val.sival_ptr = ptr;
                //sigqueue(pid, SIGCONT, s_val);
                //kill(pid, SIGSTOP);
                sigqueue(pid, SIGUSR1, s_val);
        }
       
        while(1);
       
        return 0;
}

gcc fork.c -o fork
./fork &
[1] 3986

parent pid = 3986
child pid = 3987
This is parent process

ps -ef | grep fork
message+   662     1  0 17:23 ?        00:00:02 dbus-daemon --system --fork
bruceji+  1951  1878  0 18:41 ?        00:00:01 dbus-daemon --fork --session --address=unix:abstract=/tmp/dbus-IhuIaA1yWk
bruceji+  2007  2001  0 18:41 ?        00:00:00 /bin/dbus-daemon --config-file=/etc/at-spi2/accessibility.conf --nofork --print-address 3
bruceji+  2061  1878  0 18:41 ?        00:00:00 //bin/dbus-daemon --fork --print-pid 7 --print-address 9 --config-file /usr/share/fcitx/dbus/daemon.conf
bruceji+  3732  2498  0 19:49 pts/8    00:00:00 vi fork.c
bruceji+  3986  3757 99 19:53 pts/0    00:00:14 ./fork
bruceji+  3987  3986  0 19:53 pts/0    00:00:00 [fork] <defunct>
bruceji+  3997  3757  0 19:53 pts/0    00:00:00 grep --color=auto fork


论坛徽章:
0
发表于 2015-11-19 09:04 |显示全部楼层
子进程在调用sigaction之前 信号就来了。然后子进程就结束了,父进程没有wait()回收

论坛徽章:
0
发表于 2015-11-22 10:04 |显示全部楼层
回复 2# 大笨蛋才会放弃


我让父进程沉睡5s,可是子进程还是没有捕获并处理父进程发来的信号,最后还是变成了僵尸,为何?


  else {
                sleep(5);
                printf("child pid = %d\n", pid);
                printf("This is parent process\n");
                s_val.sival_ptr = ptr;
                //sigqueue(pid, SIGCONT, s_val);
                //kill(pid, SIGSTOP);
                sigqueue(pid, SIGUSR1, s_val);
        }  


gcc fork.c -o fork

./fork &

[1] 3441
parent pid = 3441
This is child process
child pid = 3442
This is parent process
signal$ ps -ef | grep fork
message+   668     1  0 09:40 ?        00:00:00 dbus-daemon --system --fork
bruceji+  1701  1628  0 09:42 ?        00:00:01 dbus-daemon --fork --session --address=unix:abstract=/tmp/dbus-UHkPS49AXt
bruceji+  1763  1755  0 09:42 ?        00:00:00 /bin/dbus-daemon --config-file=/etc/at-spi2/accessibility.conf --nofork --print-address 3
bruceji+  1827  1628  0 09:42 ?        00:00:00 //bin/dbus-daemon --fork --print-pid 7 --print-address 9 --config-file /usr/share/fcitx/dbus/daemon.conf
bruceji+  3285  2467  0 10:00 pts/0    00:00:00 vi fork.c
bruceji+  3441  3337 83 10:00 pts/25   00:00:24 ./fork
bruceji+  3442  3441 16 10:00 pts/25   00:00:05 [fork] <defunct>
bruceji+  3586  3337  0 10:01 pts/25   00:00:00 grep --color=auto fork

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:09
发表于 2015-11-30 18:25 |显示全部楼层
子进程结束以后 父进程没有wait就会啊......

论坛徽章:
0
发表于 2015-11-30 22:56 |显示全部楼层
thx!
回复 4# lolizeppelin


   

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
发表于 2015-12-04 16:37 |显示全部楼层
只管杀 不管埋  就...

论坛徽章:
0
发表于 2015-12-04 19:49 |显示全部楼层
精辟!回复 6# yjh777


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP