进程间通信系列 之 概述与对比  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 下有一些,但传递的基本上都是关于传递一个整数,传递指针的我还没看到。我一直没有实
现不同进程间的指针传递(实际上更有意义),也许在实现方法上存在问题吧

转自:http://blog.csdn.net/ritterliu/article/details/11498265


转载于:https://www.cnblogs.com/youngerchina/p/5624524.html

进程间通信系列 之 信号实例相关推荐

  1. 进程间通信系列 之 信号(理论)

    进程间通信系列 之 概述与对比   http://blog.csdn.net/younger_china/article/details/15808685  进程间通信系列 之 共享内存及其实例   ...

  2. linux 进程 signal,c/c++ linux 进程间通信系列1,使用signal,kill

    linux 进程间通信系列1,使用signal,kill 信号基本概念:  软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.进程之间可以互相通过系统调用kill发送软中断信号.内核 ...

  3. Matlab系列之信号解调

    Matlab系列之信号解调 序 BASK信号解调 示例 结果 QAM信号解调 示例 结果 BPSK信号解调 示例 结果 BFSK信号解调 示例 结果 结语 更多精彩,等你发现~ 序 上一篇对信号调制有 ...

  4. Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

    Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...

  5. 三菱modbusRTU通讯实例_干货 | 解析西门子系列PLC编程实例

    点击箭头处"工业之家",选择"关注公众号"! 解析西门子系列PLC编程实例 三辊卷板机有分为机械式和液压式,机械式又分为对称式和非对称式.用于重型机械公司,将金 ...

  6. 反射学习系列3-反射实例应用

    反射学习系列目录 反射学习系列1-反射入门 反射学习系列2-特性(Attribute) 反射学习系列3-反射实例应用 作者 例子这个东西其实挺难弄得,弄个简单的,虽然能说明问题但却容易让人觉得没实用价 ...

  7. 创建mysql代码实例_MySQL筹建系列之多实例_mysql

    mysql搭建系列之多实例 所谓多实例,就是在一台服务器上搭建.运行多个MySQL实例,每个实例使用不同的服务端口,通过不同的socket监听:物理上,每个实例拥有独立的参数配置文件及数据库. 通常情 ...

  8. python qt5 数据改变 触发信号_pyqt5自定义信号实例解析

    本文研究的主要是pyqt5自定义信号实例解析的相关内容,具体介绍如下. PyQt5已经自动定义了很多QT内建的信号.但是在实际的使用中为了灵活使用信号与槽机制,我们可以根据需要自定义signal.可以 ...

  9. 进程间通信的方式——信号、管道、消息队列、共享内存

    进程间通信的方式--信号.管道.消息队列.共享内存 多进程: 首先,先来讲一下fork之后,发生了什么事情. 由fork创建的新进程被称为子进程(child process).该函数被调用一次,但返回 ...

最新文章

  1. Oracle 删除归档日志脚本
  2. numpy.arcsin详解
  3. scanf返回值_IO FILE之任意读写和scanf的限制绕过
  4. Ansible基础概述
  5. 使用iBATIS3.0完成增删改查
  6. linux ptrace 读内存,Linux高级调试与优化——ptrace
  7. 终端软件_DMSTerminal现场管控终端软件正式发布
  8. silverlight开发无法调试问题
  9. CentOS6.8 x86_64bit安装nginx-1.6.2
  10. 新浪邮箱文件下载php,免费邮箱大全收集-国内篇
  11. 微信小程序扫描程序码携带参数
  12. matlab进行预测误差过大,神经网络预测误差太大怎么办,如何看预测结果
  13. Linux--进程与任务管理
  14. 巴曙松:寻找可持续的经济复苏
  15. 运行npm install 出现thon Python is not set from command line or npm configuration解决方案
  16. 如何快速定位接口响应慢问题
  17. 作业调度算法【平均周转时间、平均带权周转时间、先来先服务FCFS、短作业优先SJF、高优先权(级)算法FPF、高响应比优先算法HRRN】
  18. SVN使用教程(二)
  19. 上学易 APP - 小学信息平台,学区查询,幼升小,小学,学区,学校基础信息平台
  20. 小鸟云虚拟主机Wordpress上传中文附件出现乱码

热门文章

  1. mysql只update不做修改_105岁老人抽烟喝酒不运动,长寿秘诀:只做4件事,不做1件事...
  2. 仅需6道题轻松掌握Python时间和日期处理 | Python技能树征题
  3. java面试编程面试题_Java编程面试的前50个问题
  4. jquery-ui 对话框_jQuery UI对话框插件
  5. java java se_Java SE 9:尝试资源改进
  6. 编程 单引号 双引号_我的25个最喜欢的编程引号也很有趣
  7. java 配对问题_Java中的配对类是什么?
  8. guice依赖注入原理_Google Guice依赖注入示例教程
  9. 有效管理云计算成本的多个措施
  10. Jenkins 教程(一)实现自动化打包及邮件通知