免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3181 | 回复: 8
打印 上一主题 下一主题

请高手看下,这个子进程为什么无法处理来自父进程的信号?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 17:29 |只看该作者 |倒序浏览
如下面的程序,我使用signal函数注册了信号处理函数handler,handler根据信号量来分支处理。使用fork创建了一个子进程。使用sleep让父进程等待子进程先运行,运行中的子进程用kill函数向其父进程发送了SIGUSR1信号,实验结果表明父进程如期处理了该信号。但是父进程向子进程发送的SIGUSR2确没有得到子进程的响应,问题出在哪里了呢? 请linux高手过目、指点。谢谢!
程序的运行结果是这样的:
I'm child
parent: catch SIGUSR1
now kill the child...


原代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <sys/wait.h>
#include <signal.h>

void handler(int signo)
{
    switch(signo)
    {
        case SIGUSR1:
            printf("parent: catch SIGUSR1\n");
            break;
        case SIGUSR2:
            printf("child: catch SIGUSR2\n");
            break;
        default:
            printf("never goes here\n");
            break;
    }
    return;
}

int main()
{
    pid_t ppid,cpid;
   
    if(SIG_ERR == signal(SIGUSR1, handler))
    {
        perror("fail to set handler for SIGUSR1");
        exit(1);
    }
    if(SIG_ERR == signal(SIGUSR2, handler))
    {
        perror("fail to set handler for SIGUSR2");
        exit(1);
    }
   
    ppid = getpid();
   
    if((cpid = fork()) < 0)
    {
        perror("fail to fork");
        exit(1);
    }
    else if(0 == cpid)
    {
        printf("I'm child\n");
        if(-1 == kill(ppid, SIGUSR1))
        {
            perror("fail to send SIGUSR1");
            exit(1);
        }
        //while(1);
        sleep(3);
        exit(0);        
    }
    else
    {
        sleep(1);
        
        if(-1 == kill(cpid, SIGUSR2))
        {
            perror("fail to send SIGUSR2");
            exit(1);
        }
        printf("now kill the child...\n");
        if(-1 == kill(cpid, SIGKILL))
        {
            perror("fail to kill child");
            exit(1);
        }
        
        if(-1 == wait(NULL))
        {
            perror("fail to wait");
            exit(1);
        }
    }
    return 0;
}





论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2011-12-22 18:12 |只看该作者
缓冲导致的问题:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>

  4. #include <sys/wait.h>
  5. #include <signal.h>

  6. void handler(int signo)
  7. {
  8.     switch(signo)
  9.     {
  10.         case SIGUSR1:
  11.             fprintf(stderr, "parent: catch SIGUSR1\n");
  12.             break;
  13.         case SIGUSR2:
  14.             fprintf(stderr, "child: catch SIGUSR2\n");
  15.             break;
  16.         default:
  17.             printf("never goes here\n");
  18.             break;
  19.     }
  20.     return;
  21. }

  22. int main()
  23. {
  24.     pid_t ppid,cpid;
  25.    
  26.     if(SIG_ERR == signal(SIGUSR1, handler))
  27.     {
  28.         perror("fail to set handler for SIGUSR1");
  29.         exit(1);
  30.     }
  31.     if(SIG_ERR == signal(SIGUSR2, handler))
  32.     {
  33.         perror("fail to set handler for SIGUSR2");
  34.         exit(1);
  35.     }
  36.    
  37.     ppid = getpid();
  38.    
  39.     if((cpid = fork()) < 0)
  40.     {
  41.         perror("fail to fork");
  42.         exit(1);
  43.     }
  44.     else if(0 == cpid)
  45.     {
  46.         printf("I'm child\n");
  47.         if(-1 == kill(ppid, SIGUSR1))
  48.         {
  49.             perror("fail to send SIGUSR1");
  50.             exit(1);
  51.         }
  52.         //while(1);
  53.         sleep(3);
  54.         exit(0);        
  55.     }
  56.     else
  57.     {
  58.         sleep(1);
  59.         
  60.         if(-1 == kill(cpid, SIGUSR2))
  61.         {
  62.             perror("fail to send SIGUSR2");
  63.             exit(1);
  64.         }
  65.         printf("now kill the child...\n");
  66.         if(-1 == kill(cpid, SIGKILL))
  67.         {
  68.             perror("fail to kill child");
  69.             exit(1);
  70.         }
  71.         
  72.         if(-1 == wait(NULL))
  73.         {
  74.             perror("fail to wait");
  75.             exit(1);
  76.         }
  77.     }
  78.     return 0;
  79. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-12-22 19:05 |只看该作者
缓冲的问题?不明白,什么意思?
另外,我看了一下,你好像就是把printf改成fprintf了,但是实验结果证明还是不对啊。故障依旧。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2011-12-22 19:49 |只看该作者
banbi1985 发表于 2011-12-22 19:05
缓冲的问题?不明白,什么意思?
另外,我看了一下,你好像就是把printf改成fprintf了,但是实验结果证明还 ...

那你再給 printf("now kill the child...\n"); 後面加個 sleep(3); 試試。不過這個只是治標不治本。

论坛徽章:
0
5 [报告]
发表于 2011-12-22 20:14 |只看该作者
我试了一下,没有问题啊

论坛徽章:
0
6 [报告]
发表于 2011-12-22 20:17 |只看该作者
确实,在父进程发送完SIGUSR2信号后,等待一会儿再杀子进程就可以了。

但缓冲的问题是指什么? 这仅是治标又怎么讲? 其中的原理您给说一说吧?谢谢

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2011-12-22 22:08 |只看该作者
banbi1985 发表于 2011-12-22 20:17
确实,在父进程发送完SIGUSR2信号后,等待一会儿再杀子进程就可以了。

但缓冲的问题是指什么? 这仅是治 ...

看看這個貼子:http://bbs.chinaunix.net/thread-3588712-1-1.html

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
8 [报告]
发表于 2011-12-22 23:16 |只看该作者
用sleep让子进程先执行不好吧~

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2011-12-23 08:55 |只看该作者
crazyhadoop 发表于 2011-12-22 23:16
用sleep让子进程先执行不好吧~

当然不好了,这个并不能保证子进程一定会先执行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP