进程间通信系列 之 信号实例
进程间通信系列 之 概述与对比 http://blog.csdn.net/younger_china/article/details/15808685
进程间通信系列 之 共享内存及其实例 http://blog.csdn.net/younger_china/article/details/15961557
进程间通信系列 之 共享内存简单实例 http://blog.csdn.net/younger_china/article/details/15991081
进程间通信系列 之 信号(理论) http://blog.csdn.net/younger_china/article/details/15976961
进程间通信系列 之 信号实例 http://blog.csdn.net/younger_china/article/details/15968715
进程间通信系列 之 信号综合实例 http://blog.csdn.net/younger_china/article/details/15980485
进程间通信系列 之 命名管道FIFO及其应用实例 http://blog.csdn.net/younger_china/article/details/15808531
进程间通信系列 之 管道(客户端和服务端通信) http://blog.csdn.net/younger_china/article/details/15809281
进程间通信系列 之 信号量详解及编程实例 http://blog.csdn.net/younger_china/article/details/15808531
进程间通信系列 之 消息队列函数及其范例 http://blog.csdn.net/younger_china/article/details/15503871
进程间通信系列 之 消息队列应用实例 http://blog.csdn.net/younger_china/article/details/15808501
进程间通信系列 之 socket套接字及其实例 http://blog.csdn.net/younger_china/article/details/15809163
进程间通信系列 之 socket套接字实例 http://blog.csdn.net/younger_china/article/details/15809207
信号
信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。
信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。
进程可以通过三种方式来响应一个信号:
(1)忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及 SIGSTOP;
(2)捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数;
(3)执行缺省操作;
信号发送及处理
sigreceive.c
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>void new_op(int,siginfo_t*,void*);
int main(int argc,char**argv){struct sigaction act;int sig=atoi(argv[1]);sigemptyset(&act.sa_mask);act.sa_flags=SA_SIGINFO;act.sa_sigaction=new_op;if(sigaction(sig,&act,NULL)<0){printf("install signal error\n");}int count=0;while(1){sleep(1);printf("wait for signal:%d\n",++count);if(count>10)break;}return 0;
}void new_op(int signum,siginfo_t* info,void* myact){printf("receive signal:%d\n",signum);sleep(5);
}
后台运行 sigreceive signo &,可获得该进程的 ID,假设为 pid,然后再另一终端上运行 kill -s signo pid 验证信号的发送接收及处理.
信号传递附加信息
1.向进程本身发送信号,并传递指针参数
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>void new_op(int sig,siginfo_t* info,void* act){int i=0;for(i=0;i<10;i++){printf("%c,",(*((char*)((*info).si_ptr)++)));}printf("\nhandle sig:%d\n",sig);
}int main(int argc,char** argv){struct sigaction act;union sigval mysigval;int i;int sig;pid_t pid=getpid();char data[10]={'2','2','2','2','2'};mysigval.sival_ptr=data;sig=atoi(argv[1]);sigemptyset(&act.sa_mask);act.sa_sigaction=new_op;act.sa_flags=SA_SIGINFO;if(sigaction(sig,&act,NULL)<0){printf("install sig error\n");}// int count=0;
// while(1){
// sleep(1);printf("wait for sig\n");sigqueue(pid,sig,mysigval);// if(count++>10)break;// }return 0;
}
2、 不同进程间传递整型参数:把 1 中的信号发送和接收放在两个程序中,并且在发送过程中传递整型参
数
sig_send.c
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>int main(int argc,char** argv){union sigval sigv;// char** data={"First","Second"};
// char** data = (char**)malloc(sizeof(char* )*2);// data[0] = "first";// data[1] ="second";// char* data[2]={"First","Second"};
// sigv.sival_ptr=data;char data[2]={'1','1'};
// sigv.sival_ptr=data;sigv.sival_int=9;pid_t pid=atoi(argv[1]);int sig=atoi(argv[2]);sigqueue(pid,sig,sigv);printf("Message has been send\n");sleep(7);printf("Send dead\n");return 0;
}
sig_rev.c
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>void op(int sig,siginfo_t *info,void* sigact){printf("inside op\n");int count=0;
// while((*info).si_ptr!=NULL){count++;// char* p=*((char**)((*info).si_ptr)+1);// char* p=((char*)((*info).si_ptr));// printf("op %c\n",*p);
// printf("%c,",(*((char*)((*info).si_ptr))));printf("op value:%d\n",info->si_int);// }
}int main(int argc,char** argv){int sig=atoi(argv[1]);pid_t pid=getpid();printf("Rev pid:%d\n",pid);struct sigaction act;sigemptyset(&act.sa_mask);act.sa_flags=SA_SIGINFO;act.sa_sigaction=op;if(sigaction(sig,&act,NULL)<0){printf("install sig error\n");}int count=0;while(1){sleep(1);count++;printf("wait for sig %d\n",count);if(count>30)break;}return 0;
}
注:实例 2 的两个例子侧重点在于用信号来传递信息,目前关于在 linux 下通过信号传递信息的实例非常
少,倒是 Unix 下有一些,但传递的基本上都是关于传递一个整数,传递指针的我还没看到。我一直没有实
现不同进程间的指针传递(实际上更有意义),也许在实现方法上存在问题吧
转载于:https://www.cnblogs.com/youngerchina/p/5624524.html
进程间通信系列 之 信号实例相关推荐
- 进程间通信系列 之 信号(理论)
进程间通信系列 之 概述与对比 http://blog.csdn.net/younger_china/article/details/15808685 进程间通信系列 之 共享内存及其实例 ...
- linux 进程 signal,c/c++ linux 进程间通信系列1,使用signal,kill
linux 进程间通信系列1,使用signal,kill 信号基本概念: 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.进程之间可以互相通过系统调用kill发送软中断信号.内核 ...
- Matlab系列之信号解调
Matlab系列之信号解调 序 BASK信号解调 示例 结果 QAM信号解调 示例 结果 BPSK信号解调 示例 结果 BFSK信号解调 示例 结果 结语 更多精彩,等你发现~ 序 上一篇对信号调制有 ...
- Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存
Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...
- 三菱modbusRTU通讯实例_干货 | 解析西门子系列PLC编程实例
点击箭头处"工业之家",选择"关注公众号"! 解析西门子系列PLC编程实例 三辊卷板机有分为机械式和液压式,机械式又分为对称式和非对称式.用于重型机械公司,将金 ...
- 反射学习系列3-反射实例应用
反射学习系列目录 反射学习系列1-反射入门 反射学习系列2-特性(Attribute) 反射学习系列3-反射实例应用 作者 例子这个东西其实挺难弄得,弄个简单的,虽然能说明问题但却容易让人觉得没实用价 ...
- 创建mysql代码实例_MySQL筹建系列之多实例_mysql
mysql搭建系列之多实例 所谓多实例,就是在一台服务器上搭建.运行多个MySQL实例,每个实例使用不同的服务端口,通过不同的socket监听:物理上,每个实例拥有独立的参数配置文件及数据库. 通常情 ...
- python qt5 数据改变 触发信号_pyqt5自定义信号实例解析
本文研究的主要是pyqt5自定义信号实例解析的相关内容,具体介绍如下. PyQt5已经自动定义了很多QT内建的信号.但是在实际的使用中为了灵活使用信号与槽机制,我们可以根据需要自定义signal.可以 ...
- 进程间通信的方式——信号、管道、消息队列、共享内存
进程间通信的方式--信号.管道.消息队列.共享内存 多进程: 首先,先来讲一下fork之后,发生了什么事情. 由fork创建的新进程被称为子进程(child process).该函数被调用一次,但返回 ...
最新文章
- Oracle 删除归档日志脚本
- numpy.arcsin详解
- scanf返回值_IO FILE之任意读写和scanf的限制绕过
- Ansible基础概述
- 使用iBATIS3.0完成增删改查
- linux ptrace 读内存,Linux高级调试与优化——ptrace
- 终端软件_DMSTerminal现场管控终端软件正式发布
- silverlight开发无法调试问题
- CentOS6.8 x86_64bit安装nginx-1.6.2
- 新浪邮箱文件下载php,免费邮箱大全收集-国内篇
- 微信小程序扫描程序码携带参数
- matlab进行预测误差过大,神经网络预测误差太大怎么办,如何看预测结果
- Linux--进程与任务管理
- 巴曙松:寻找可持续的经济复苏
- 运行npm install 出现thon Python is not set from command line or npm configuration解决方案
- 如何快速定位接口响应慢问题
- 作业调度算法【平均周转时间、平均带权周转时间、先来先服务FCFS、短作业优先SJF、高优先权(级)算法FPF、高响应比优先算法HRRN】
- SVN使用教程(二)
- 上学易 APP - 小学信息平台,学区查询,幼升小,小学,学区,学校基础信息平台
- 小鸟云虚拟主机Wordpress上传中文附件出现乱码
热门文章
- mysql只update不做修改_105岁老人抽烟喝酒不运动,长寿秘诀:只做4件事,不做1件事...
- 仅需6道题轻松掌握Python时间和日期处理 | Python技能树征题
- java面试编程面试题_Java编程面试的前50个问题
- jquery-ui 对话框_jQuery UI对话框插件
- java java se_Java SE 9:尝试资源改进
- 编程 单引号 双引号_我的25个最喜欢的编程引号也很有趣
- java 配对问题_Java中的配对类是什么?
- guice依赖注入原理_Google Guice依赖注入示例教程
- 有效管理云计算成本的多个措施
- Jenkins 教程(一)实现自动化打包及邮件通知