- 论坛徽章:
- 0
|
最近在研究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类型的信号处理函数,有什么特别的地方??? |
|