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 ...
随机推荐
- GitHub Top 100 的项目(iOS)
主要对当前 GitHub 排名前 100 的项目做一个简单的简介, 方便初学者快速了解到当前 Objective-C 在 GitHub 的情况. Android 版本的在此: https://gith ...
- art.dialog 返回提示
<form target="_top" /> 1 如果加 target="_top" 提示跳出子页面 2 如果不加则在子页面提示
- 使用xmarks同步 chrome ie firefox safari书签
xmarks是什么? Install Xmarks on each computer you use, and it seamlessly integrates with your web brows ...
- linux 中的 tar 解压
Type at the command prompt tar xvzf file-1.0.tar.gz - tgfo uncompress a gzip tar file (.tgz or .tar. ...
- .Net魔法堂:提取注释生成API文档
一.前言 在多人协作的项目中,除了良好的代码规范外,完整的API文档也相当重要.通过文档我们快速了解系统各模块的实际接口,及其使用场景.使用示例,一定程度上降低沟通成本,和减少后期维护中知识遗失等风险 ...
- 混合使用TFVC和GIT配置库的优化方案
如果要选出最近几年在软件工程领域最热的技术,那毋庸置疑就是git了.作为分布式源代码管理(DVCS)的代表,git以其超快的操作,便捷的分支合并模型和P2P模式的代码分享模式让软件开发团队的很多复杂协 ...
- Sublime Text 收藏笔记
Sublime Text:初学者不知道的那些事 转载自: http://blog.jobbole.com/23949/
- PL/SQL远程备份和恢复Oracle数据库
(转自:http://blog.csdn.net/huchunfu/article/details/25165901) 在客户端远程备份的文件保存在数据库所在主机上,不会直接拷贝到客户端.—————— ...
- 好久没有写博客了,发现Live Writer也更新了
最近由于工作变动,工作内容和心态也有所变化,所以很久没有写博客了,而且我的开源项目深蓝词库转换也很近没有更新了.今天打开LiveWriter发现居然有新版本,于是果断更新.现在新的LiveWriter ...
- mysql优化之索引篇
对mysql优化是一个综合性的技术,主要包括 a: 表的设计合理化(符合3NF) b: 添加适当索引(index) [四种: 普通索引.主键索引.唯一索引unique.全文索引] c: 分表技术(水平 ...