sigaction函数相对于siganl函数控制信号的发送要更加精确一些,其函数原型为:

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

实验代码:

  1. #include <signal.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <errno.h>
  6.  
  7. /* 信号处理函数:信号量,发送者传递的额外信息,参数 */
  8. void func_handler(int signum, siginfo_t *info, void *arg)
  9. {
  10. printf("/nget the signal. pid : %d, uid : %d\n", info->si_pid, info->si_uid);
  11. printf("sival_int : %d\n", (int)arg);
  12. /* printf("si_signo : %d, si_code : %d, si_errno : %d\n", info->si_signo, info->si_code, info->si_errno);
  13.  
  14. */
  15. printf("si_status : %d\n", info->si_status);
  16. /* printf("si_utime : %d, si_stime : %d\n", info->si_utime, info->si_stime); */
  17. printf("signal from address : 0x%x\n", info->si_addr);
  18. printf("--------++++++++--------\n");
  19. }
  20.  
  21. int main(int argc, char *argv[])
  22. {
  23. struct sigaction signal_action;
  24. /* initializes the signal set given by set to empty, with all signals excluded from the set */
  25. /* 初始化sigaction */
  26. sigemptyset(&signal_action.sa_mask);
  27.  
  28. signal_action.sa_sigaction = func_handler; /* 设置信号处理函数 */
  29. /* 设置标志位 */
  30. /* SA_SIGINFO:信号发送者会提供额外的信息(siginfo_t),信号处理函数应该使用三参数(int,siginfo_t *,void *) */
  31. /* SA_RESTART:如果系统调用被信号中断,则不返回错误,而是自动重启系统调用(重入机制) */
  32. signal_action.sa_flags |= SA_SIGINFO | SA_RESTART;
  33.  
  34. /* The sigaction(int, const struct sigaction *new, struct sigaction *old) system call is used to change
  35.  
  36. the action taken by a process on receipt of a specific signal */
  37. /* 修改信号的处理函数 */
  38. if(sigaction(SIGINT, &signal_action, NULL) == -1)
  39. {
  40. printf("sigaction failed, app exit. error : %s!\n", strerror(errno));
  41. exit(1);
  42. }
  43. while(1)
  44. {
  45. /* 暂停进程,或注释掉该行代码 */
  46. pause();
  47. }
  48. printf("done!\n");
  49.  
  50. return 0;
  51. }

运行程序后,使用命令:ps -au查看该程序的进程编号

使用sigqueue函数向指定进程发送指定信号,实验代码:

  1. #include <signal.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <errno.h>
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9. union sigval arg;
  10. arg.sival_int = 2017; /* sigqueue指定的整型参数 */
  11. int pid = atoi(argv[1]); /* 指定一个进程编号 */
  12. int sig = atoi(argv[2]); /* 指定一个信号 */
  13.  
  14. printf("pid : %d, sig : %d\n", pid, sig);
  15.  
  16. /* 检测该进程是否存在 */
  17. if(sigqueue(pid, 0, arg) != 0)
  18. {
  19. printf("no process's pid : %d, app exit!\n", pid);
  20. exit(-1);
  21. }
  22. printf("check process succeed!\n");
  23.  
  24. int times = 0;
  25. for(;times<3;times++)
  26. {
  27. printf("sending a signal : [%d] to process : [%d].\n", sig, pid);
  28. if(sigqueue(pid, sig, arg) == -1)
  29. {
  30. printf("sigqueue failed, app exit. err : %s!\n", strerror(errno));
  31. exit(-1);
  32. }
  33. printf("times : %d, sigqueue success, sleep 2 second!\n", times + 1);
  34. sleep(2);
  35. }
  36.  
  37. return 0;
  38. }

使用命令./sigqueue 32499 2, 意思是对进程32499进程发送SIGINT(2)信号

sigqueue进程每隔2秒发送一个SIGINT信号,sigaction进程就显示了信号发送者的额外信息.

当然,也可以通过kill命令向指定的进程发送指定的信号,比如

sigaction和sigqueue的更多相关文章

  1. Linux 改进捕捉信号机制(sigaction,sigqueue)

    sigaction函数 sigaction函数的功能是用于改变进程接收到特定信号后的行为. int sigaction(int signum, const struct sigaction *act, ...

  2. linux中高级信号函数sigaction和sigqueue实例

    /************************************************************************* > File Name: sigquque. ...

  3. Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号

    Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号 背景 上一讲我们介绍了Unix IPC中的2种管道. 回顾一下上一讲的介绍,IPC的方式通常有: Unix IPC包括:管道 ...

  4. linux系统编程之信号(六):信号发送函数sigqueue和信号安装函数sigaction

    一,sigaction() #include <signal.h> int sigaction(int signum,const struct sigaction *act,struct ...

  5. linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction

    信号发送函数sigqueue和信号安装函数sigaction sigaction函数用于改变进程接收到特定信号后的行为. sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然 ...

  6. sigaction和实时信号sigqueue

    sigaction函数sigaction函数的功能是用于改变进程接收到特定信号后的行为.int sigaction(int signum, const struct sigaction *act,st ...

  7. 信号发送接收函数:sigqueue/sigaction

    信号是一种古老的进程间通信方式,下面的例子利用sigqueue发送信号并附带数据:sigaction函数接受信号并且处理时接受数据. 1.sigqueue: 新的信号发送函数,比kill()函数传递了 ...

  8. linux下的struct sigaction

    工作中使用案例: struct sigaction act; act.sa_sigaction = handleSignal; act.sa_flags = SA_SIGINFO; sigemptys ...

  9. signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数

    信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...

随机推荐

  1. Mac 使用技巧

    1.快捷键(Mac 键盘快捷键https://support.apple.com/zh-cn/HT201236) Command-Shift-Z:重做,也就是撤销(Command-Z)的逆向操作 Co ...

  2. 嵌入式Linux学习笔记(0)基础命令。——Arvin

    学习记录: 到今天为止ARM裸机开发学习进程:1.2.1-1.2.14 预科班知识Linux介绍学习进程:0.2.1-0.2.6 学习内容笔记: 学习了Linux的开发方式的优劣介绍 学习了常用文件夹 ...

  3. Kafka是如何实现高吞吐率的

    Kafka是如何实现高吞吐率的 原创 2016-02-27 杜亦舒 性能与架构 Kafka是分布式消息系统,需要处理海量的消息,Kafka的设计是把所有的消息都写入速度低容量大的硬盘,以此来换取更强的 ...

  4. Modbus RTU程序开发解读

    Modbus是很好的串口通信协议,其中RTU协议最为常用,通过Modbus RTU,我们可以轻松读写串口信息. 从官网下载libModbus,观察modbus.h可知关键的结构体为: typedef ...

  5. 从世界坐标转换成ui的rect坐标的方法

    这个东西整整折磨了我一个通宵.原谅我先这样放上来.明天整理整理 using UnityEngine; using System.Collections; using UnityEngine.UI; p ...

  6. Css动画形式弹出遮罩层,内容区上下左右居中于不定宽高的容器中

    <!DOCTYPE html> <html> <head> </head> <body id="body"> <! ...

  7. 结构struct

    1.结构变量 1)定义结构类型 struct student { char *name; int age; int score[3]; }; 2)定义结构变量 struct student stu1, ...

  8. [解决]小程序要求的 TLS 版本必须大于等于 1.2

    今天微信小程序发现wx.request不好使了,调试报错: 小程序要求的 TLS 版本必须大于等于 1.2 查官方文档 解决方法 在 PowerShell中运行以下内容, 然后重启服务器 # Enab ...

  9. 开源代码Window下搭建rtmp流媒体服务器

    合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojit@qq.com 综合:有这样需求,将摄像头 ...

  10. sql server 维护计划与作业关系区别

    sql server 维护计划与作业关系区别 对于二者的区别,你可以把维护计划看作是针对数据库进行维护的作业模板.自定义作业具有更广泛的用途,当然,也具有更复杂的操作.所以,如果 仅仅是做个数据库优化 ...