一.信号

1.信号本质

信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的,信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达

信号是进程间通信机制中唯一的异步通信机制,可以看作异步通知,通知接收信号的进程有哪些事件发生了。信号机制经过POSIX实时扩展后,功能更加强大,出了基本通知功能外,还可以传递附加信息

2.信号来源

信号事件的发生有两个来源:硬件来源 (比如按下了键盘或者换其他硬件故障);软件来源,最常用的发送信号的系统函数kill ,raise、alarm、settitimer及sigqueue函数,软件来源还包括一些非法运算等操作

二.信号的种类

1.可靠性:可靠信号,非可靠信号

2.时间关系上:实时信号 与非实时信号

三.信号的处理方式

进程可以通过以下三种方式来处理一个信号:

1.忽略信号 及对信号不作任何处理,其中有两个信号不能忽略,即SIGKILL和SIGSTOP

2.捕捉信号 定义信号处理函数,当信号发生时,执行相应的处理函数

3.执行默认操作。Linux对每种信号都规定了默认操作,注意:进程对实时信号的默认反应是进程终止

两个常用信号发送函数

#include<sys/types.h>

#include<signal.h>

int kill(pid_t pid,int sig)

kill()可以用来送参数sig指定的信号给参数pid指定的进程,参数pid有以下几种情况

  • pid>0 :将信号传给进程识别码为pid的进程
  • pid=0:将信号传给和目前进程相同进程组的所有进程
  • pid= -1:将信号广播传送给系统内所有的进程
  • pid<0:将信号传给进程组识别码为pid绝对值的所有进程

#include<unistd.h>

unsigned int alarm(unsigned int seconds)

alarm()用来设置信号SIGALRM,在经过参数seconds指定的秒数后传送给目前 的级才能拿,如果参数seconds为0,则之前设置的闹钟回呗取消,并将剩下的时间返回

四.自定义处理信号方式

#include<signal.h>

void (*signal(int signum,void(*handler)(int)))(int);

signal()会依参数signum指定的信号编号来设置该信号的处理函数,当指定的信号到达是就会跳转到参数handler指定的函数执行

如果参数handler不是函数指针,则必须是下列两个常数之一

  • SIG_IGN:忽略参数signum指定的信号
  • SIG_DFL:将参数signum指定的信号重设为核心预设的信号处理方式
#include<signal.h>
#include<stdio.h>
#include<stdlib.h>void my_func(int sign_no)
{if(sign_no == SIGINT)printf("I have get SIGINT\n");else if(sign_no == SIGQUIT)printf("I have get SIGQUIT");}int main()
{printf("Waiting for signal SigINt or SIGQUIT\n");/*注册信号处理函数*/signal(SIGINT,my_func);signal(SIGQUIT,my_func);pause();exit(0);
}

sigaction()函数用于查询或者设置处理方式

#include<signal.h>

int sigaction(int signo,conststruct sigaction*restrict act, struct sigaction*restrict oact);

struct sigaction {

void (*sa_handler)(int);

void (*sa_sigaction)(int, siginfo_t *, void *);

sigset_t sa_mask;

int sa_flags;

void (*sa_restorer)(void);

}

  • sa_handler此参数和signal()的参数handler相同,代表新的信号处理函数
  • sa_mask 用来设置在处理该信号时暂时将sa_mask 指定的信号集搁置
  • sa_flags 用来设置信号处理的其他相关操作,下列的数值可用。
  • SA_RESETHAND:当调用信号处理函数时,将信号的处理函数重置为缺省值SIG_DFL
  • SA_RESTART:如果信号中断了进程的某个系统调用,则系统自动启动该系统调用
  • SA_NODEFER :一般情况下, 当信号处理函数运行时,内核将阻塞该给定信号。但是如果设置了 SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void sig_handle(int sig)
{puts("recv SIGINT");sleep(5);puts("end");
}int main(int argc, char** argv)
{struct sigaction act;act.sa_handler = sig_handle;act.sa_flags = 0;sigemptyset(&act.sa_mask);sigaddset(&act.sa_mask, SIGQUIT); //当进入信号处理函数的时候,屏蔽掉SIGQUIT的递达sigaction(SIGINT, &act, NULL);while(1)sleep(1);return 0;
}

Linux进程间通信之信号相关推荐

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

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

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

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

  3. 【linux系统编程】进程间通信:信号中断处理

    什么是信号? 信号是 Linux 进程间通信的最古老的方式.信号是软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式 .信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断, ...

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

    目录 Linux进程间通信概述 1.管道 无名管道(pipe) 有名管道(fifo) 2.消息队列(msg) 消息队列的通信原理 消息队列相关api 消息队列收发数据 键值生成 消息队列移除 3.共享 ...

  5. linux之进程间通信--使用信号

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

  6. Linux进程间通信——信号

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

  7. linux 进程间通信及makefile 无名管道/有名管道/共享内存/信号/消息队列

    http://www.voidcn.com/article/p-hxvuiypm-mr.html https://www.cnblogs.com/wuyida/archive/2013/02/03/6 ...

  8. Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】

    linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...

  9. 深入理解Linux进程间通信(IPC)-- 信号signal

    2. 信号(上) 2.1. 信号及信号来源 2.1.1 信号本质 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进程不 ...

最新文章

  1. ubuntu联网经常掉线的解决方法
  2. Java8新特性Optional、接口中的默认方法与静态方法
  3. 009_关闭linux的THP
  4. 使用VMware安装CentOS7详请(自己做过测试)
  5. Headfirst设计模式的C++实现——策略模式(Strategy)
  6. matlab 贝叶斯工具箱,matlab的BNT贝叶斯工具箱错误求教
  7. 交换ctrl和左caps_如何在Linux中交换Ctrl和Caps Lock键
  8. 迷宫问题c语言图形化,c语言写的迷宫问题
  9. Jedis与Lua脚本结合
  10. HashMap与LinkedHashMap的结构对比
  11. java按钮禁用和启用_在浏览器中禁用(或启用)Java插件
  12. 大众点评字体_【网络爬虫实战】解决大众点评搜索页面字体加密
  13. pi/4QPSK调制解调原理
  14. 无源蜂鸣器c语言编程,电磁式蜂鸣器驱动原理与简单蜂鸣器编程及电路设计案例...
  15. 零知识证明(zero-knowledge proof)
  16. 深度增强学习:走向通用人工智能之路
  17. 程序员深度体验一周ChatGPT发现竟然....
  18. HTML nofollow 属性
  19. 育润多维发力慈善领域,勇抗企业公益大旗
  20. 求助:matlab报错:位置 2 处的索引超出数组边界(1)

热门文章

  1. esxi时区设置 +8_Shopify篇:Goolge Analystic申请及设置
  2. 微信小程序农阳历日历选择器农阳历日期互转
  3. share.weiyun.com微云网页链接无法打开 解决办法
  4. 汇编语言 变成 c语言,如何把汇编语言转换成C语言
  5. 并发执行变成串行_一篇讲透如何理解数据库并发控制
  6. python计算器简单代码_Python之三十行代码实现简易计算器
  7. 2022原料药数据查询平台(全面覆盖)
  8. 电脑自动获取ip地址在哪里设置
  9. mui checkbox radio 获取值
  10. 帝国cms 未审核 showinfo.php,帝国CMS自动审核发布信息脚本