signal()
使用该函数时,只需要指定信号类型和信号处理函数即可。不支持信号传递。
头文件:#include <signal.h>
函数原型:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
signum:指定信号代码
handler:
SIG_IGN:忽略该信号
SIG_DFL:采用系统默认方式处理信号
自定义的信号处理函数
成功:以前的信号处理函数
出错:-1
示例:使用signal()函数捕捉相应信号,并给定处理。
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
//自定义信号处理函数
void my_func(int sig_no)
{
if(sign_no==SIGINT)
{
printf("I have got SIGINT\n");
}
else if(sign_no==SIGQUIT)
{
printf("I have got SIGQUIT\n");
}
}
int main()
{
printf("Waiting for signal SIGINT or SIGQUIT...\n");
//设置信号处理函数
signal(SIGINT,my_func);
signal(SIGQUIT,my_func);
pause();//?
exit(0);
}
sigaction()
比signal()更健全,建议使用。
头文件:#include <signal.h>
函数原型:int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
signum:信号类型,除了SIGKILL和SIGSTOP之外的任何一个信号
act:指向sigaction结构体的指针,包含对特定信号处理
oldact:保存信号原先的处理方式
成功:0
出错:-1
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
//自定义信号处理函数
void my_func(int sig_no)
{
if(sign_no==SIGINT)
{
printf("I have got SIGINT\n");
}
else if(sign_no==SIGQUIT)
{
printf("I have got SIGQUIT\n");
}
}
int main()
{
struct sigaction action;
sigaction(SIGINT,0,&action);
action.sa_handler=my_func;
sigaction(SIGINT,&action,0);
sigaction(SIGINT,0,&action);
action.sa_handler=my_func;
sigaction(SIGINT,&action,0);
printf("Waiting for signal SIGINT or SIGQUIT...\n");
pause();
exit(0);
}