Linux 信号详解六(可靠信号与不可靠信号)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h> void catch_signal(int signo, siginfo_t *info, void *p)
{
switch (signo)
{
case SIGINT:
printf("accept SIGINT! recv data=%d\n",info->si_value.sival_int);
break;
case :
//SIGRTMIN似乎不是一个确定的int类型
printf("accept SIGRTMIN! recv data=%d\n",info->si_value.sival_int);
break;
case SIGUSR1:
printf("accept SIGUSR1!\n");
//取消信号阻塞
sigset_t uset;
sigemptyset(&uset);
sigaddset(&uset, SIGINT);
sigaddset(&uset, SIGRTMIN);
sigprocmask(SIG_UNBLOCK, &uset, NULL);
printf("阻塞解除了!\n");
break;
}
} int main(int arg, char *args[])
{
pid_t pid = ;
struct sigaction act;
act.sa_sigaction = catch_signal;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
//注册SIGINT信号
if (sigaction(SIGINT, &act, NULL) != )
{
printf("sigaction SIGINT failed !\n");
return -;
}
//注册SIGTMIN信号
if (sigaction(SIGRTMIN, &act, NULL) != )
{
printf("sigaction SIGINT failed !\n");
return -;
}
//注册SIGUSR1信号
if (sigaction(SIGUSR1, &act, NULL) != )
{
printf("sigaction SIGINT failed !\n");
return -;
}
//阻塞SIGINT信号和SIGTMIN信号
sigset_t bset;
sigemptyset(&bset);
sigaddset(&bset, SIGINT);
sigaddset(&bset, SIGRTMIN);
//更新进程屏蔽信号状态字
if (sigprocmask(SIG_BLOCK, &bset, NULL) != )
{
printf("sigprocmask() failed !\n");
return -;
}
pid = fork();
if (pid == -)
{
printf("fork() failed ! error message:%s\n", strerror(errno));
return -;
}
if (pid == )
{
int i = , ret = ;
union sigval v1;
union sigval v2;
for (i = ; i < ; i++)
{
v1.sival_int = + i;
ret = sigqueue(getppid(), SIGINT, v1);
if (ret != )
{
printf("发送不可靠信号SIGINT失败! error message:%s\n", strerror(errno));
} else
{
printf("发送不可靠信号SIGINT成功!\n");
}
}
for (i = ; i < ; i++)
{
v2.sival_int = + i;
ret = sigqueue(getppid(), SIGRTMIN, v2);
if (ret != )
{
printf("发送可靠信号SIGTMIN失败! error message:%s\n", strerror(errno));
} else
{
printf("发送可靠信号SIGTMIN成功!\n");
}
}
//发送SIGUSR1信号
if (kill(getppid(), SIGUSR1) != )
{
printf("kill() failed ! error message;%s\n", strerror(errno));
}
exit();
}
//父进程
int res = , status = ;
while ()
{
res = wait(&status);
if (res == -)
{
if (errno == EINTR)
{ continue;
}
break;
}
}
while ()
{
sleep();
}
return ;
}

一:SIGINT是不可靠信号。发送了3次父进程只接收到1次,SIGRTMIN是可靠信号,发送了3次父进程接收到3次信号。
二:对于可靠信号,Linux内核会缓存可靠信号,Linux内核可以缓存8192(各个Linux版本不同)条可靠信号;对于不可靠信号,Linux只能缓存一条不可靠信号。
三:执行命令行: ulimit -a
查看Linux支持的信号性能参数
四:发送信号的数量超过系统上限,将会发送失败

Linux 信号详解六(可靠信号与不可靠信号)的更多相关文章
- SIGPIPE信号详解
转自:http://blog.csdn.net/lmh12506/article/details/8457772 前一段面试的时候被问到项目中有没有处理SIGPIPE信号,怎么处理的?当时没有答出来, ...
- 第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解
第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解 信号一般使用信号分发器dispatcher.connect(),来设置信号,和信号触发函数,当捕获到信号时执行 ...
- Linux 系统结构详解
Linux 系统结构详解 Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统 ...
- (转)Linux PS 详解
原文:https://cn.aliyun.com/jiaocheng/162702.html 摘要:原文地址:http://www.cnblogs.com/wangkangluo1/archive/2 ...
- linux syslog详解
linux syslog详解 分三部分 一.syslog协议介绍 二.syslog函数 三.linux syslog配置 一.syslog协议介绍 1.介绍 在Unix类操作系统上,syslog广 ...
- Linux Ptrace 详解
转 https://blog.csdn.net/u012417380/article/details/60470075 Linux Ptrace 详解 2017年03月05日 18:59:58 阅读数 ...
- Linux命令详解之—tail命令
tail命令也是一个非常常用的文件查看类的命令,今天就为大家介绍下Linux tail命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux tail命令主要用来从指定点开始将文 ...
- Linux命令详解之—less命令
Linux下还有一个与more命令非常类似的命令--less命令,相比于more命令,less命令更加灵活强大一些,今天就给大家介绍下Linux下的less命令. 更多Linux命令详情请看:Linu ...
- Linux命令详解之—more命令
Linux more命令同cat命令一样,多用来查看文件内容,本文就为大家介绍下Linux more命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux的more命令类似 ca ...
随机推荐
- 如何开启win7端口的图文教程
Windows 7/Vista/XP/2003等系统中的远程终端服务是一项功能非常强大的服务,下面来教教大家如何开启端口:打开“控制面板”中的“Windows防火墙”,点击左侧的“高级设置” 右击“入 ...
- PHP操作mysql数据库:[2]查询数据听语音
本文主要详细讲解如何使用php语言,对mysql数据库进行查询.添加.删除.更新等操作. 工具/原料 Macromedia Dreamweaver 8 mysql数据库,php语言 一.前言 ...
- 使用CSS3滤镜让图片反转颜色
CSS提供的滤镜也是一大亮点,我一直痴迷其中,有些滤镜的效果很有用,可是有些的滤镜效果可能只是为了玩玩儿,CSS常见的滤镜有这些:grayscale, blur, sepia,所有常见的过滤器.但是如 ...
- (视频) 《快速创建网站》 2.3 WordPress初始化和功能简介
本文是<快速创建网站>系列的第4篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 访问本系列目录,请点击:http://devopshub.cn/tag ...
- javascript中,对于this指向的浅见
# this的指向在函数创建的时候确定不了.只有在执行的时候,才可以确定. ## 1 . 这里的this指向window window.fn(); 所以this.user是undefined func ...
- 【转发】NPAPI开发详解,Windows版
NPAPI开发详解,Windows版 9 jiaofeng601, +479 9人支持,来自Meteor.猪爪.hanyuxinting更多 .是非黑白 .Yuan Xulei.hyolin.Andy ...
- ORA-01501: CREATE DATABASE failed
使用dbca建库时遇到ORA-01501: CREATE DATABASE failed这个错误,检查告警日志,发现有下面错误信息: SMON: enabling tx recovery Fri Ap ...
- 神奇的decimal,也许面试会问到哦~
这段时间忙的像狗一样,写博客的事情也就耽搁了,继续扯,为什么说decimal神奇呢,大家都知道decimal是基元类型,但是 这个decimal类型在IL中居然没有相应的IL指令,也就是说CLR根本不 ...
- Java并发之BlockingQueue 阻塞队列(ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue、SynchronousQueue)
package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * Create ...
- js获得昨天前天明天时间以及setDate()
<script type="text/javascript"> function GetDateStr(AddDayCount) { var dd = new Date ...