免费注册 查看新帖 |

Chinaunix

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

使用sigaction处理信号后,进程为什么会退出?百思不得其解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-28 16:23 |只看该作者 |倒序浏览
最近在研究linux信号处理的东西,看了写文章,写了些测试代码,发现了一个问题,就是使用sigaction安装信号处理后,处理完信号,进程会退出,这是为什么?
代码如下:


#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <signal.h>

void sig_handler(int signo, siginfo_t * info, void * p);

int main(char** argc, int argv)
{
        printf("pid = %d\n", getpid());
        struct sigaction act = {0};
       
        sigemptyset(&act.sa_mask);
        act.sa_sigaction = sig_handler;
       
        act.sa_flags = SA_SIGINFO;
        /*
        for (int i = 1; i <= 32; i++)
        {       
                if (i == 2 || i == 9 || i == 19 || i == 32) continue;
               
                if(sigaction(i, &act, NULL)<0)
                {
                        printf("Install SIG[%d] Action Error:%s\n\a", i, strerror(errno));
                       
                        return (1);
                }
        }
        */
        sigaction(SIGALRM, &act, NULL);
        sigaction(SIGUSR1, &act, NULL);
       
        if (alarm(3) != 0)
        {
                printf("Set Alarm Error:%s\n\a", strerror(errno));
               
                return (1);
        }
        printf("set alarm in 3 sec\n");
       
        sleep(-1); //这里已经无限期等待了
        return 0;
}

void sig_handler(int signo, siginfo_t * info, void * p)
{
        printf("[Signal]::sig_handler(): SIG [%d] received !\n", signo);
       
        if (signo == SIGALRM)
        {
                printf("sig_handler: recv signal = %d\n", signo);
                pid_t pid = getpid();
                printf("sig_handler: pid = %d\n", pid);
                int sig = SIGUSR1;
                char pdata[16] = {0};
                union sigval sigv;
                strcpy(pdata, "Hello, Signals");
                sigv.sival_ptr = (void*)pdata;
                if (0 != sigqueue(getpid(), sig, sigv))                //向本进程发送信号,并传递附加信息
                {
                        printf("sigqueue error! pid = %d :%d %s\n\a", getpid(), errno, strerror(errno));
                }
                return ;
        }

        if (signo == SIGUSR1)
        {
                printf("sig_handler: recv signal = %d\n", signo);
                if (!info)
                {
                        printf("sig_handler: recv info = NULL\n");
                        return;
                }
                printf("sig_handler: recv [%s] \n", (char*)(info->si_ptr));
        }       
}

代码很简单,就是先设置一个闹钟,闹钟触发后,向本进程发送一个SIGUSR1信号,附带一个字符串数据。
我使用的是sa_sigaction类型的信号处理函数,收到SIGUSR1后,整个进程居然自动退出!
我测试了如果使用sa_handler来处理信号,就一切正常,进程不会退出。
这具体是为什么呢?sa_sigaction类型的信号处理函数,有什么特别的地方???

论坛徽章:
0
2 [报告]
发表于 2008-12-28 16:36 |只看该作者
自己顶~
aquei 该用户已被删除
3 [报告]
发表于 2008-12-31 20:49 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2009-01-01 17:08 |只看该作者

是sleep的问题

不管是在windows还是在linux操作系统上,sleep导致的进程pending都会被系统信号打断的。我觉得你可以试试其他signal,不光是sigalrm会这样。

论坛徽章:
0
5 [报告]
发表于 2009-01-01 17:18 |只看该作者
sleep(-1)被信号唤醒 ,处理完信号程序就退出了,应该是正常的流程把
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP