signal与sigaction函数使用
2017-05-10 23:31
459 查看
signal,此函数相对简单一些,给定一个信号,给出信号处理函数则可,当然,函数简单,其功能也相对简单许多,函数详情直接 man 手册查看。
sigaction () 函数是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口)给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact。
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
功能:检查或修改与指定信号相关联的处理动作(可同时两种操作)
参数:
@signum 指定信号编号(除了SIGKILL和SIGSTOP两个信号)
@act 新的信号处理函数
@oldact 旧的信号处理函数
返回值:0 - 成功,-1 - 失败。
结构体sigaction定义:
struct sigaction{
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flag;
void (*sa_sigaction)(int,siginfo_t *,void *);
};
结构体成员含义:
sa_handler字段包含一个信号捕捉函数的地址
sa_mask字段说明了一个信号集,在调用该信号捕捉函数之前,这一信号集要加进进程的信号屏蔽字中。仅当从信号捕捉函数返回时再将进程的信号屏蔽字复位为原先值。
sa_flag是一个选项,主要理解两个
SA_INTERRUPT 由此信号中断的系统调用不会自动重启
SA_RESTART 由此信号中断的系统调用会自动重启
SA_SIGINFO 提供附加信息,一个指向siginfo结构的指针以及一个指向进程上下文标识符的指针
sa_sigaction最后这个参数是一个替代的信号处理程序,当设置SA_SIGINFO时才会用他。
/* 举例演示 */ #include <signal.h> #include <stdio.h> #include <unistd.h> void ouch(int sig) { printf("I got signal %d\n", sig); // (void) signal(SIGINT, SIG_DFL); // (void) signal(SIGINT, ouch); } int main() { (void) signal(SIGINT, ouch); while(1) { printf("hello world...\n"); sleep(1); } }
sigaction () 函数是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口)给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact。
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
功能:检查或修改与指定信号相关联的处理动作(可同时两种操作)
参数:
@signum 指定信号编号(除了SIGKILL和SIGSTOP两个信号)
@act 新的信号处理函数
@oldact 旧的信号处理函数
返回值:0 - 成功,-1 - 失败。
结构体sigaction定义:
struct sigaction{
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flag;
void (*sa_sigaction)(int,siginfo_t *,void *);
};
结构体成员含义:
sa_handler字段包含一个信号捕捉函数的地址
sa_mask字段说明了一个信号集,在调用该信号捕捉函数之前,这一信号集要加进进程的信号屏蔽字中。仅当从信号捕捉函数返回时再将进程的信号屏蔽字复位为原先值。
sa_flag是一个选项,主要理解两个
SA_INTERRUPT 由此信号中断的系统调用不会自动重启
SA_RESTART 由此信号中断的系统调用会自动重启
SA_SIGINFO 提供附加信息,一个指向siginfo结构的指针以及一个指向进程上下文标识符的指针
sa_sigaction最后这个参数是一个替代的信号处理程序,当设置SA_SIGINFO时才会用他。
/* 举例演示 */ #include <stdio.h> #include <signal.h> void show_handler(int sig) { printf("I got signal %d\n", sig); int i; for(i = 0; i < 5; i++) { printf("i = %d\n", i); sleep(1); } } int main(void) { int i = 0; struct sigaction act, oldact; act.sa_handler = show_handler; sigaddset(&act.sa_mask, SIGQUIT); //见注(1) act.sa_flags = SA_RESETHAND | SA_NODEFER; //见注(2) //act.sa_flags = 0; //见注(3) sigaction(SIGINT, &act, &oldact); while(1) { sleep(1); printf("sleeping %d\n", i); i++; } } /* 注: (1) 如果在信号SIGINT(Ctrl + c)的信号处理函数show_handler执行过程中,本进程收到信号SIGQUIT(Crt+\),将阻塞该信号,直到show_handler执行结束才会处理信号SIGQUIT。 (2) SA_NODEFER 一般情况下,当信号处理函数运行时,内核将阻塞<该给定信号SIGINT>。但是如果设置了SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号。 SA_NODEFER是这个标记的正式的POSIX名字(还有一个名字SA_NOMASK,为了软件的可移植性,一般不用这个名字) SA_RESETHAND 当调用信号处理函数时,将信号的处理函数重置为缺省值。SA_RESETHAND是这个标记的正式的POSIX名字(还有一个名字SA_ONESHOT,为了软件的可移植性,一般不用这个名字) (3) 如果不需要重置该给定信号的处理函数为缺省值;并且不需要阻塞该给定信号(无须设置sa_flags标志),那么必须将sa_flags清零,否则运行将会产生段错误。但是sa_flags清零后可能会造成信号丢失! */
相关文章推荐
- siginalExample.c(使用signal和sigaction函数捕捉和处理信号)
- linux信号机制之sigaction结构体浅析,signal 函数,信号捕捉
- linux信号机制之sigaction结构体浅析,signal 函数,信号捕捉
- python 使用 signal模块实现函数调用超时问题
- signal函数和sigaction结构体理解
- signal()和sigaction()函数简单用法
- signal 和 sigaction 函数
- signal signal函数每次设置具体的信号处理函数(非SIG_IGN)只能生效一次,多次调用需要调用时在加类似监听的方法!!! 最好用sigaction
- linux 信号的捕捉和发送函数的简单使用:sigaction()和sigqueue()
- Linux信号signal介绍,signal()函数,sigaction()函数
- 使用 sigaction 函数
- linux信号机制之sigaction结构体浅析,signal 函数,信号捕捉
- linux信号机制之sigaction结构体浅析,signal 函数,信号捕捉
- linux信号机制之sigaction结构体浅析,signal 函数,信号捕捉
- sigaction使用(signal siginfo_t)
- linux信号机制之sigaction结构体浅析,signal 函数,信号捕捉
- sigaction 和 signal 函数
- linux信号机制之sigaction结构体浅析,signal 函数,信号捕捉
- 使用 sigaction 函数实现可靠信号
- 王保明老师Linux学习笔记---------信号----signal()函数使用实例