sigqueue函数原型:

函数作用:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用

int sigqueue(pid_t pid, int signo, const union sigval value);

分析:

  • 第一个参数: 指定接收信号的进程id
  • 第二个参数:确定即将发送的信号
  • 第三个参数:是一个联合结构体union sigval,指定了信号传递的参数,即通常所说的4字节值

程序清单

1. 测试代码:

  • 发送端
 #include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <unistd.h> int main(int argc, char *argv[])
{
if(argc != )
{
fprintf(stderr, "Usage %s pid\n", argv[]);
exit();
}
pid_t pid = atoi(argv[]);
union sigval v;
v.sival_int = ;
sigqueue(pid, SIGINT, v);
sleep();
return ;
}
  • 接收端
 #include <string.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h> void handler(int sig, siginfo_t *info, void *ctx)
{
printf("recv a sig = %d data = %d data = %d\n", sig, info->si_value.sival_int, info->si_int);
} int main(int argc, char *argv[])
{
printf("I'm %d\n", getpid());
struct sigaction act;
act.sa_sigaction = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO; if(sigaction(SIGINT, &act, NULL) < )
{
perror("sigaction error");
exit();
}
for(; ;)
pause();
return ;
}

输出结果:

  • 发送端

  • 接收端

2. 测试代码

  • 发送端
 #include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <unistd.h> int main(int argc, char *argv[])
{
if(argc != )
{
fprintf(stderr, "Usage %s pid\n", argv[]);
exit();
}
pid_t pid = atoi(argv[]);
union sigval v;
v.sival_int = ;
sigqueue(pid, SIGINT, v);
sigqueue(pid, SIGINT, v);
sigqueue(pid, SIGINT, v);
sigqueue(pid, SIGRTMIN, v);
sigqueue(pid, SIGRTMIN, v);
sigqueue(pid, SIGRTMIN, v);
sleep();
kill(pid, SIGUSR1);
return ;
}
  • 接收端
 #include <string.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h> void handler(int sig)
{
if(sig == SIGINT || sig == SIGRTMIN)
printf("recv a sig = %d\n", sig);
else if(sig == SIGUSR1)
{
sigset_t s;
sigemptyset(&s);
sigaddset(&s, SIGINT);
sigaddset(&s, SIGRTMIN);
sigprocmask(SIG_UNBLOCK, &s, NULL);
}
} int main(int argc, char *argv[])
{
printf("I'm %d\n", getpid());
struct sigaction act;
act.sa_sigaction = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = ; sigset_t s;
sigemptyset(&s);
sigaddset(&s, SIGINT);
sigaddset(&s, SIGRTMIN);
sigprocmask(SIG_BLOCK, &s, NULL);
if(sigaction(SIGINT, &act, NULL) < )
{
perror("sigaction error");
exit();
}
if(sigaction(SIGRTMIN, &act, NULL) < )
{
perror("sigaction error");
exit();
}
if(sigaction(SIGUSR1, &act, NULL) < )
{
perror("sigaction error");
exit();
}
for(; ;)
pause();
return ;
}

输出结果

  • 发送端

  • 接收端

函数sigsuspend的更多相关文章

  1. sigsuspend sigprocmask函数的用法

    一个进程的信号屏蔽字规定了当前堵塞而不能递送给该进程的信号集.调用函数sigprocmask能够检測或更改其信号屏蔽字,或者在一个步骤中同一时候运行这两个操作. #include <signal ...

  2. Linux进程间通信(二):信号集函数 sigemptyset()、sigprocmask()、sigpending()、sigsuspend()

    我们已经知道,我们可以通过信号来终止进程,也可以通过信号来在进程间进行通信,程序也可以通过指定信号的关联处理函数来改变信号的默认处理方式,也可以屏蔽某些信号,使其不能传递给进程.那么我们应该如何设定我 ...

  3. UNIX环境高级编程--10. 信号

    第十章        信号    信号是软中断,提供了一种处理异步事件的方法.例如,终端用户键入终端键,会通过信号机制停止一个进程,或及早终止管道中的下一个程序.    每个信号都有一个名字,SIG开 ...

  4. IPC——信号

    Linux进程间通信——使用信号 一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过 ...

  5. linux进程通信之信号

    本节主要学习信号和与信号相关的处理函数,兴许还会更新. http://blog.csdn.net/xiaoliangsky/article/details/40264151 一 信号 信号是UNIX和 ...

  6. 《UNIX级别编程环境》注意读出信号(2)

    1.功能sigaction sigaction动与指定信号相关联的处理动作.其函数原型例如以下: #inlcude <signal.h> int sigaction(int signo,c ...

  7. 《UNIX环境高级编程(第3版)》

    <UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...

  8. Linux-进程间的通信-信号集函数【转】

    我们已经知道,我们可以通过信号来终止进程,也可以通过信号来在进程间进行通信,程序也可以通过指定信号的关联处理函数来改变信号的默认处理方式,也可以屏蔽某些信号,使其不能传递给进程.那么我们应该如何设定我 ...

  9. Linux c 屏蔽信号、切换信号

    信号导致的问题 不是任何信号我们都需要的,如果遇到我们不想处理的信号,我们怎么避免这个信号? 1.      信号屏蔽 intsigprocmask(int how,//操作方式 SIG_BLOCK屏 ...

随机推荐

  1. Python全栈(第一部分)day3

    昨日内容回顾 格式化输出 %s %d %% 编码 ascii: 只能显示英文,特殊字符,数字 万国码unicode: 最开始16位,中文不够,用32位,占用4个字节 升级: utf-8 utf-16 ...

  2. MySQL全备+binlog恢复方法之伪装master【原创】

    利用mysql全备 +binlog server恢复方法之伪装master 单实例试验 一.试验环境 10.72.7.40 实例 mysql3306为要恢复的对象,mysql3306的全备+binlo ...

  3. js学习笔记--基础部分

    自增 自增 ++ 通过自增可以使变量在自身的基础上增加1 对于一个变量自增以后,原变量的值会立即自增1 无论使a++, 还是++a,都会立即使原变量的值自增1. 不同的是a++ 和++a的值不同. a ...

  4. web前端之性能

    1.避免布局抖动 function resizeAllParagraphsToMatchBlockWidth() { // Puts the browser into a read-write-rea ...

  5. Spring MVC全局异常处理

    继承HandlerExceptionResolver接口实现自己的处理方法,如: public class MyHandlerExceptionResolver implements HandlerE ...

  6. 002_运维SOP

    一. <1>SOP:运维工作的标准化 <2>回滚:代码回滚 <3>降级:是利用有限资源,保障系统核心功能高可用.有损的架构方法 <4>多活切换:多机房切 ...

  7. EF数据迁移

    在项目中使用Entity Framework的Code First模式,进行数据迁移时,Migration文件夹中存放的是每一次Entity的修改如何同步到数据的操作方法,每个文件中都只有Up和Dow ...

  8. python实现求最大公约数与最小公倍数

    记录python实现最大公约数&最小公位数两种算法 概念 最大公约数:指两个或多个整数共有约数中最大的一个 最小公倍数:两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就 ...

  9. Webapi 跨域 解决解决错误No 'Access-Control-Allow-Origin' header is present on the requested resource 问题

    首先是web端(http://localhost:53784) 请求 api(http://localhost:81/api/)时出现错误信息: 查看控制台会发现错误:XMLHttpRequest c ...

  10. Netflix正式开源其API网关Zuul 2

    5 月 21 日,Netflix 在其官方博客上宣布正式开源微服务网关组件 Zuul 2.Netflix 公司是微服务界的楷模,他们有大规模生产级微服务的成功应用案例,也开源了相当多的微服务组件(详见 ...