#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 信号详解六(可靠信号与不可靠信号)的更多相关文章

  1. SIGPIPE信号详解

    转自:http://blog.csdn.net/lmh12506/article/details/8457772 前一段面试的时候被问到项目中有没有处理SIGPIPE信号,怎么处理的?当时没有答出来, ...

  2. 第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解

    第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解 信号一般使用信号分发器dispatcher.connect(),来设置信号,和信号触发函数,当捕获到信号时执行 ...

  3. Linux 系统结构详解

    Linux 系统结构详解 Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统 ...

  4. (转)Linux PS 详解

    原文:https://cn.aliyun.com/jiaocheng/162702.html 摘要:原文地址:http://www.cnblogs.com/wangkangluo1/archive/2 ...

  5. linux syslog详解

    linux syslog详解 分三部分 一.syslog协议介绍 二.syslog函数 三.linux syslog配置   一.syslog协议介绍 1.介绍 在Unix类操作系统上,syslog广 ...

  6. Linux Ptrace 详解

    转 https://blog.csdn.net/u012417380/article/details/60470075 Linux Ptrace 详解 2017年03月05日 18:59:58 阅读数 ...

  7. Linux命令详解之—tail命令

    tail命令也是一个非常常用的文件查看类的命令,今天就为大家介绍下Linux tail命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux tail命令主要用来从指定点开始将文 ...

  8. Linux命令详解之—less命令

    Linux下还有一个与more命令非常类似的命令--less命令,相比于more命令,less命令更加灵活强大一些,今天就给大家介绍下Linux下的less命令. 更多Linux命令详情请看:Linu ...

  9. Linux命令详解之—more命令

    Linux more命令同cat命令一样,多用来查看文件内容,本文就为大家介绍下Linux more命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux的more命令类似 ca ...

随机推荐

  1. IOS开发之小实例--使用UIImagePickerController创建一个简单的相机应用程序

    前言:本篇博文是本人阅读国外的IOS Programming Tutorial的一篇入门文章的学习过程总结,难度不大,因为是入门.主要是入门UIImagePickerController这个控制器,那 ...

  2. MongoDB Java Driver

    本文使用 Java 来描述对 Mongodb 的相关操作,数据库版本是 3.2.8,驱动版本为 3.2.2. 本文将讨论 如何连接MongoDB 文档的 CURD 操作 文档的上传和下载 1. 连接到 ...

  3. git技巧记录--blame

    git blame [-L<m,n>] FilePath 可以查看代码每一行是谁写的(根据该行最后一次改动情况), -L表示要查看的行数范围, m: 起始行数, n:结束行数. 方便快速定 ...

  4. lumen可以使用laravel-ide-helper

    1.laravel-ide-helper 地址https://github.com/barryvdh/laravel-ide-helper 在项目根目录执行composer安装命令 composer ...

  5. 天书笔记:HTML+CSS实现顶部导航栏

    此笔记纯属本人脑残笔记,阅读困难不理解属正常现象,初学者尽量不要阅读,否则轻则口吐白沫重则走火入魔,切记切记 先晒效果图: 效果要求类似于b站的顶部导航(..原谅我老是拿b站做例子:) ) 然后是代码 ...

  6. PHP 取前一天或后一天、一个月时间

    //获得当前时间     //date()格式化时间返回String类型.     date("Y-m-d H:i:s") $current_date = date(’Y-m-d’ ...

  7. C/C++ sizeof函数解析——解决sizeof求结构体大小的问题

    C/C++中不同数据类型所占用的内存大小 32位                 64位 char               1                    1 int           ...

  8. PHPCMS如何开启手机站点

    现在手机端用户增长急速增长,看天猫今年双十一,有47%交易是移动端交易的,所以手机功能已逐渐替代电脑的功能,使用手机上网已经成为了互联网新的趋势,很多客户以及站长都希望手机能够访问自己的网站,那么今天 ...

  9. ARM学习篇一 点亮LED

    要点亮LED,先决条件是什么,当然得有相应的硬件设施.板子的整个电路图比较大,我就直接取相关部分. 给发光二级管加上3.3v电压后,通过1k电阻,直接与S3C2440连接.至于为什么要加电阻,大家应该 ...

  10. 高级c++头文件bits/stdc++.h

    用这种方法声明头文件只需两行代码 #include<bits/stdc++.h> using namespace std; 这个头文件包含以下等等C++中包含的所有头文件: #includ ...