当前位置: 技术问答>linux和unix
sigaction函數问题
来源: 互联网 发布时间:2016-10-04
本文导语: #include"stdio.h" #include"stdlib.h" #include"signal.h" void sigusr1_handler(int signo) { printf("catch SIGUSR1n"); sleep(5); printf("back to mainn"); } int main(void) { struct sigaction act; act.sa_handler=sigusr1_handler; act.sa_flags=SA_NODEFER; ...
#include"stdio.h"
#include"stdlib.h"
#include"signal.h"
void sigusr1_handler(int signo)
{
printf("catch SIGUSR1n");
sleep(5);
printf("back to mainn");
}
int main(void)
{
struct sigaction act;
act.sa_handler=sigusr1_handler;
act.sa_flags=SA_NODEFER;
act.sa_sigaction=NULL;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask,SIGTERM);
if(sigaction(SIGTERM,&act,NULL)==-1)
{
printf("fail to set handler for SIGUSR1n");
exit(1);
}
printf("process beginn");
sleep(20);
printf("donen");
return 0;
}
这是一个信号处理程序,在shell中编译该程序如下
$gcc -g nodefer.c -o nodefer
在shell中运行该程序如下
$./nodefer
process begin
在另一个shell中使用ps命令得到进程ID
$ps -u admin
PID TTY TIME CMD
2131 ..... nodefer
使用kill命另向该进程发送SIGUSR1信号
$kill -USR1 2131
此时第一个shell输出:
用户定义信号 1.然后进程就结束了
按道理应该输出:
catch SIGUSR1.然后等待下一个信号才对.不知道这是什么原因.情哪位高手指点一下
我gdb调试了一下,出现:
26 sleep(20);
(gdb)
Program received signal SIGUSR1, User defined signal 1.
0x00007ffff7b03370 in nanosleep () from /lib/libc.so.6
#include"stdlib.h"
#include"signal.h"
void sigusr1_handler(int signo)
{
printf("catch SIGUSR1n");
sleep(5);
printf("back to mainn");
}
int main(void)
{
struct sigaction act;
act.sa_handler=sigusr1_handler;
act.sa_flags=SA_NODEFER;
act.sa_sigaction=NULL;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask,SIGTERM);
if(sigaction(SIGTERM,&act,NULL)==-1)
{
printf("fail to set handler for SIGUSR1n");
exit(1);
}
printf("process beginn");
sleep(20);
printf("donen");
return 0;
}
这是一个信号处理程序,在shell中编译该程序如下
$gcc -g nodefer.c -o nodefer
在shell中运行该程序如下
$./nodefer
process begin
在另一个shell中使用ps命令得到进程ID
$ps -u admin
PID TTY TIME CMD
2131 ..... nodefer
使用kill命另向该进程发送SIGUSR1信号
$kill -USR1 2131
此时第一个shell输出:
用户定义信号 1.然后进程就结束了
按道理应该输出:
catch SIGUSR1.然后等待下一个信号才对.不知道这是什么原因.情哪位高手指点一下
我gdb调试了一下,出现:
26 sleep(20);
(gdb)
Program received signal SIGUSR1, User defined signal 1.
0x00007ffff7b03370 in nanosleep () from /lib/libc.so.6
|
SIGKIL信号的信号处理函数应该只能使用系统默认的函数 即杀死进程
lz要做实验的话 可以修改一下其他的信号处理函数
lz要做实验的话 可以修改一下其他的信号处理函数