寒假学习 第20天 (linux 高级编程)
2014-02-09 01:20
405 查看
寒假学习 第20天 (linux 高级编程) 笔记总结
例子:
在sleep()的10秒中内发出SIGINT信号,不会中断,但在这10秒钟发出本身的信号会排队,发送SIGUSR1信号就会退出(SIGUSR1没有注册)
sigaction在处理信号的时候,可以就是传递数据
sigqueue在发送信号时候,可以发送数据
sigaction / sigqueue 相当于 signal / kill 的增强版本,且这4个函数可以混合使用(例如sigaction发出的信号signal可以处理等)
使用sigaction / sigqueue有两个理由
稳定性
增强功能
const struct sigaction *act, //输入的结构体,指定处理函数及其参数
struct sigaction *oldact); //返回原来的处理函数的结构体
struct sigaction {
void (*sa_handler)(int); //传统的信号处理函数
void (*sa_sigaction)(int, siginfo_t *, void *); //信号处理函数,多带了一个传递额外信息的参数,函数第三个参数是保留参数
sigset_t sa_mask; //信号处理函数在处理过程中要屏蔽的信号
int sa_flags; //控制信号是调用结构体中上面第一个函数还是上面第二个函数 SA_SIGINFO 表示使用第二个
void (*sa_restorer)(void); //保留的成员
};
例子:
int sigqueue(pid_t pid, int sig, const union sigval value); //value 传递的信息
union sigval {
int sival_int;
void *sival_ptr;
};
例子1:
运行,上上面的代码程序就会收到SIGUSR1的信号
如果把上上面的代码改成下面这样,就可以得到传递的数据
一、sigqueue/sigaction
1. 信号中断函数是否被其他信号中断?
信号函数调用中只屏蔽本身信号,不屏蔽其他信号例子:
#include <stdio.h> #include <signal.h> void handle(int s) { printf("start!\n"); sleep(10); printf("end\n"); } int main(int argc, const char *argv[]) { signal(SIGINT,handle); while(1); return 0; }
在sleep()的10秒中内发出SIGINT信号,不会中断,但在这10秒钟发出本身的信号会排队,发送SIGUSR1信号就会退出(SIGUSR1没有注册)
2. 怎样保证函数调用中屏蔽指定的信号呢?
sigaction可以指定处理函数调用的屏蔽信号sigaction在处理信号的时候,可以就是传递数据
sigqueue在发送信号时候,可以发送数据
sigaction / sigqueue 相当于 signal / kill 的增强版本,且这4个函数可以混合使用(例如sigaction发出的信号signal可以处理等)
使用sigaction / sigqueue有两个理由
稳定性
增强功能
函数原型
int sigaction(int signum, //处理的信号const struct sigaction *act, //输入的结构体,指定处理函数及其参数
struct sigaction *oldact); //返回原来的处理函数的结构体
struct sigaction {
void (*sa_handler)(int); //传统的信号处理函数
void (*sa_sigaction)(int, siginfo_t *, void *); //信号处理函数,多带了一个传递额外信息的参数,函数第三个参数是保留参数
sigset_t sa_mask; //信号处理函数在处理过程中要屏蔽的信号
int sa_flags; //控制信号是调用结构体中上面第一个函数还是上面第二个函数 SA_SIGINFO 表示使用第二个
void (*sa_restorer)(void); //保留的成员
};
例子:
#include <stdio.h> #include <signal.h> #include <unistd.h> void handle(int s) { printf("start!\n"); sleep(10); printf("end\n"); } int main(int argc, const char *argv[]) { printf("pid:%d\n",getpid()); struct sigaction act={0}; act.sa_handler=handle; sigemptyset(&act.sa_mask); sigaddset(&act.sa_mask,SIGINT); act.sa_flags=0; sigaction(SIGUSR1,&act,0); while(1); return 0; }信号处理函数中 SIGUSR1与SIGINT都被屏蔽。
int sigqueue(pid_t pid, int sig, const union sigval value); //value 传递的信息
union sigval {
int sival_int;
void *sival_ptr;
};
例子1:
#include <stdio.h> #include <signal.h> int main(int argc, const char *argv[]) { union sigval val; val.sival_int=333; sigqueue(20899,SIGUSR1,val); return 0; }
运行,上上面的代码程序就会收到SIGUSR1的信号
如果把上上面的代码改成下面这样,就可以得到传递的数据
#include <stdio.h> #include <signal.h> #include <unistd.h> void handle(int s,siginfo_t* info,void *d) { printf("start!\n"); printf("info:%d\n",info->si_int); sleep(10); printf("end\n"); } int main(int argc, const char *argv[]) { printf("pid:%d\n",getpid()); struct sigaction act={0}; act.sa_handler=handle; sigemptyset(&act.sa_mask); sigaddset(&act.sa_mask,SIGINT); act.sa_flags=SA_SIGINFO; sigaction(SIGUSR1,&act,0); while(1); return 0; }
相关文章推荐
- 寒假学习 第15天 (linux 高级编程) 笔记 总结
- 寒假学习 第16.17天 (linux 高级编程)
- 寒假学习 第18、19天 (linux 高级编程)
- 寒假学习 第25天 (linux 高级编程)
- 寒假学习 第二天 (linux 高级编程)
- 寒假学习 第七、八天 (linux 高级编程)
- 寒假学习 第22、23天 (linux 高级编程)
- 寒假学习 第13,14天 (linux 高级编程)
- 寒假学习 第六天 (linux 高级编程)
- 寒假学习 第11天 (linux 高级编程)
- 寒假学习 第24天 (linux 高级编程)
- 寒假学习 第一天 (linux 高级编程)
- 寒假学习 第九、十天 (linux 高级编程)
- 寒假学习 第三天 (linux 高级编程)
- 寒假学习 第21天 (linux 高级编程)
- 寒假学习 第四、五天 (linux 高级编程)
- 寒假学习 第12天 (linux 高级编程)
- 嵌入式系统开发学习步骤(Linux高级编程学习顺序)
- 嵌入式系统开发学习步骤(Linux高级编程学习顺序)
- 学习 Linux高级编程06_B