sigaction和sigqueue
sigaction函数相对于siganl函数控制信号的发送要更加精确一些,其函数原型为:
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
实验代码:
- #include <signal.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <errno.h>
- /* 信号处理函数:信号量,发送者传递的额外信息,参数 */
- void func_handler(int signum, siginfo_t *info, void *arg)
- {
- printf("/nget the signal. pid : %d, uid : %d\n", info->si_pid, info->si_uid);
- printf("sival_int : %d\n", (int)arg);
- /* printf("si_signo : %d, si_code : %d, si_errno : %d\n", info->si_signo, info->si_code, info->si_errno);
- */
- printf("si_status : %d\n", info->si_status);
- /* printf("si_utime : %d, si_stime : %d\n", info->si_utime, info->si_stime); */
- printf("signal from address : 0x%x\n", info->si_addr);
- printf("--------++++++++--------\n");
- }
- int main(int argc, char *argv[])
- {
- struct sigaction signal_action;
- /* initializes the signal set given by set to empty, with all signals excluded from the set */
- /* 初始化sigaction */
- sigemptyset(&signal_action.sa_mask);
- signal_action.sa_sigaction = func_handler; /* 设置信号处理函数 */
- /* 设置标志位 */
- /* SA_SIGINFO:信号发送者会提供额外的信息(siginfo_t),信号处理函数应该使用三参数(int,siginfo_t *,void *) */
- /* SA_RESTART:如果系统调用被信号中断,则不返回错误,而是自动重启系统调用(重入机制) */
- signal_action.sa_flags |= SA_SIGINFO | SA_RESTART;
- /* The sigaction(int, const struct sigaction *new, struct sigaction *old) system call is used to change
- the action taken by a process on receipt of a specific signal */
- /* 修改信号的处理函数 */
- if(sigaction(SIGINT, &signal_action, NULL) == -1)
- {
- printf("sigaction failed, app exit. error : %s!\n", strerror(errno));
- exit(1);
- }
- while(1)
- {
- /* 暂停进程,或注释掉该行代码 */
- pause();
- }
- printf("done!\n");
- return 0;
- }
运行程序后,使用命令:ps -au查看该程序的进程编号
使用sigqueue函数向指定进程发送指定信号,实验代码:
- #include <signal.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <errno.h>
- int main(int argc, char *argv[])
- {
- union sigval arg;
- arg.sival_int = 2017; /* sigqueue指定的整型参数 */
- int pid = atoi(argv[1]); /* 指定一个进程编号 */
- int sig = atoi(argv[2]); /* 指定一个信号 */
- printf("pid : %d, sig : %d\n", pid, sig);
- /* 检测该进程是否存在 */
- if(sigqueue(pid, 0, arg) != 0)
- {
- printf("no process's pid : %d, app exit!\n", pid);
- exit(-1);
- }
- printf("check process succeed!\n");
- int times = 0;
- for(;times<3;times++)
- {
- printf("sending a signal : [%d] to process : [%d].\n", sig, pid);
- if(sigqueue(pid, sig, arg) == -1)
- {
- printf("sigqueue failed, app exit. err : %s!\n", strerror(errno));
- exit(-1);
- }
- printf("times : %d, sigqueue success, sleep 2 second!\n", times + 1);
- sleep(2);
- }
- return 0;
- }
使用命令./sigqueue 32499 2, 意思是对进程32499进程发送SIGINT(2)信号
sigqueue进程每隔2秒发送一个SIGINT信号,sigaction进程就显示了信号发送者的额外信息.
当然,也可以通过kill命令向指定的进程发送指定的信号,比如
sigaction和sigqueue的更多相关文章
- Linux 改进捕捉信号机制(sigaction,sigqueue)
sigaction函数 sigaction函数的功能是用于改变进程接收到特定信号后的行为. int sigaction(int signum, const struct sigaction *act, ...
- linux中高级信号函数sigaction和sigqueue实例
/************************************************************************* > File Name: sigquque. ...
- Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号
Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号 背景 上一讲我们介绍了Unix IPC中的2种管道. 回顾一下上一讲的介绍,IPC的方式通常有: Unix IPC包括:管道 ...
- linux系统编程之信号(六):信号发送函数sigqueue和信号安装函数sigaction
一,sigaction() #include <signal.h> int sigaction(int signum,const struct sigaction *act,struct ...
- linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction
信号发送函数sigqueue和信号安装函数sigaction sigaction函数用于改变进程接收到特定信号后的行为. sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然 ...
- sigaction和实时信号sigqueue
sigaction函数sigaction函数的功能是用于改变进程接收到特定信号后的行为.int sigaction(int signum, const struct sigaction *act,st ...
- 信号发送接收函数:sigqueue/sigaction
信号是一种古老的进程间通信方式,下面的例子利用sigqueue发送信号并附带数据:sigaction函数接受信号并且处理时接受数据. 1.sigqueue: 新的信号发送函数,比kill()函数传递了 ...
- linux下的struct sigaction
工作中使用案例: struct sigaction act; act.sa_sigaction = handleSignal; act.sa_flags = SA_SIGINFO; sigemptys ...
- signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数
信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...
随机推荐
- Mac 使用技巧
1.快捷键(Mac 键盘快捷键https://support.apple.com/zh-cn/HT201236) Command-Shift-Z:重做,也就是撤销(Command-Z)的逆向操作 Co ...
- 嵌入式Linux学习笔记(0)基础命令。——Arvin
学习记录: 到今天为止ARM裸机开发学习进程:1.2.1-1.2.14 预科班知识Linux介绍学习进程:0.2.1-0.2.6 学习内容笔记: 学习了Linux的开发方式的优劣介绍 学习了常用文件夹 ...
- Kafka是如何实现高吞吐率的
Kafka是如何实现高吞吐率的 原创 2016-02-27 杜亦舒 性能与架构 Kafka是分布式消息系统,需要处理海量的消息,Kafka的设计是把所有的消息都写入速度低容量大的硬盘,以此来换取更强的 ...
- Modbus RTU程序开发解读
Modbus是很好的串口通信协议,其中RTU协议最为常用,通过Modbus RTU,我们可以轻松读写串口信息. 从官网下载libModbus,观察modbus.h可知关键的结构体为: typedef ...
- 从世界坐标转换成ui的rect坐标的方法
这个东西整整折磨了我一个通宵.原谅我先这样放上来.明天整理整理 using UnityEngine; using System.Collections; using UnityEngine.UI; p ...
- Css动画形式弹出遮罩层,内容区上下左右居中于不定宽高的容器中
<!DOCTYPE html> <html> <head> </head> <body id="body"> <! ...
- 结构struct
1.结构变量 1)定义结构类型 struct student { char *name; int age; int score[3]; }; 2)定义结构变量 struct student stu1, ...
- [解决]小程序要求的 TLS 版本必须大于等于 1.2
今天微信小程序发现wx.request不好使了,调试报错: 小程序要求的 TLS 版本必须大于等于 1.2 查官方文档 解决方法 在 PowerShell中运行以下内容, 然后重启服务器 # Enab ...
- 开源代码Window下搭建rtmp流媒体服务器
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojit@qq.com 综合:有这样需求,将摄像头 ...
- sql server 维护计划与作业关系区别
sql server 维护计划与作业关系区别 对于二者的区别,你可以把维护计划看作是针对数据库进行维护的作业模板.自定义作业具有更广泛的用途,当然,也具有更复杂的操作.所以,如果 仅仅是做个数据库优化 ...