sigaction函数详解
来源:互联网 发布:java编程工具 编辑:程序博客网 时间:2024/04/28 09:25
原文地址:http://sys.firnow.com/linux/x8002010n06m/24s9088986.html
sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)。他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口)给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact。
int sigaction(int signo,const struct sigaction *restrict act, struct sigaction *restrict oact);
结构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_SIGINFO时才会用他。
例子:
#include <stdio.h>
#include <signal.h>
#include <unistd.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清零后可能会造成信号丢失!
另外:
SIGCHLD
SIGCHLD属于unix以及类unix系统的一种信号
产生原因 siginfo_t代码值 1,子进程已终止 CLD_EXITED 2,子进程异常终止(无core) CLD_KILLED 3,子进程异常终止(有core) CLD_DUMPED 4,被跟踪子进程以陷入 CLD_TRAPPED 5,子进程已停止 CLD_STOPED 5,停止的子进程已经继续 CLD_CONTINUED 描述: 在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。按系统默认将忽略此信号。如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。信号的捕捉函数中通常调用wait函数以取得进程ID和其终止状态。
- sigaction函数详解
- sigaction函数详解
- sigaction函数的详解
- sigaction函数详解
- sigaction函数详解
- sigaction 详解
- 详解sigaction
- sigaction函数
- sigaction 函数
- sigaction 函数
- sigaction函数
- sigaction 函数
- sigaction函数
- sigaction函数
- C - sigaction详解
- sigaction函数与sigaction结构体同名
- signal 和 sigaction 函数
- 转 sigaction 函数说明
- FTP文件下载与断点续传
- MQ使用
- HDU 1249 三角形
- Android - 控件(View)之TextView, Button, ImageButton, ImageView, CheckBox, RadioButton, AnalogClock, DigitalClock 的简单介绍
- 编译Android源码前,安装sun-jdk java 1.5版本的方法
- sigaction函数详解
- 判断Android手机是否联网的方法
- sql中count函数和distinct函数的配合使用
- POJ 1458 || HDOJ 1159 Common Subsequence (DP)
- 使用Project统计项目实时进度
- (转)Item 1. Iterators
- struts1.1 配置文件属性
- 一个告诉你如何轻松、快乐、高质量地生活的网站,同时还可以学英文
- AN ERROR OCCURRED IN A TRIGGERED SQL -723