3信号处理之:避免异步IO的类型,SIGCHLD信号处理
1避免异步I/O的类型
sig_atomic_t
平台下的原子类型
volatile(晚上上网查找)
防止编译器开启优化选项是,优化对内存的读写。
2 SIGCHLD信号处理
SIGCHLD的产生条件
子进程终止时
子进程接收到SIGSTOP信号停止时
子进程处在停止态,接受到SIGCONT后唤醒时
案例说明:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
void sys_err(char *str)
{
perror(str);
exit(1);
}
void do_sig_child(int signo)
{
int status;
pid_t pid;
while ((pid = waitpid(0, &status, WNOHANG)) > 0) {
if (WIFEXITED(status))
printf("child %d exit %d\n", pid, WEXITSTATUS(status));
else if (WIFSIGNALED(status))
printf("child %d cancel signal %d\n", pid,WTERMSIG(status));
}
}
int main(void)
{
pid_t pid;
int i;
for (i = 0; i < 10; i++) {
if ((pid = fork()) == 0)
break;
else if (pid < 0)
sys_err("fork");
}
if (pid == 0) {
int n = 18;
while (n--) {
printf("child ID %d\n", getpid());
sleep(1);
}
return i;
}
else if (pid > 0) {
//先设置捕捉
//再解除对SIGCHLD的阻塞
struct sigaction act;
act.sa_handler = do_sig_child;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGCHLD, &act, NULL);
while (1) {
printf("Parent ID %d\n", getpid());
sleep(1);
}
}
return 0;
}
运行结果:
最后运行后的结果都是:Parent ID 6000
3.status处理方式
pid_t waitpid(pid_t pid,int *status,int options)
options
WNOHANG
没有子进程结束,立即返回
WUNTRACED
如果子进程由于被停止产生的SIGCHLD, waitpid则立即返回
WCONTINUED
如果子进程由于被SIGCONT唤醒而产生的SIGCHLD, waitpid则立即返回获取status
WIFEXITED(status)
子进程正常exit终止,返回真
WEXITSTATUS(status)返回子进程正常退出值
WIFSIGNALED(status)
子进程被信号终止,返回真
WTERMSIG(status)返回终止子进程的信号值
WIFSTOPPED(status)子进程被停止,返回真
WSTOPSIG(status)返回停止子进程的信号值
WIFCONTINUED(status)
子进程由停止态转为就绪态,返回真
4.sigqueue
int sigqueue(pid_t pid,int sig,const union sigval value)
union sigval{
int sival_int;
void *sival_ptr;
}
5 sigaction
void (*sa_sigaction)(int, siginfo_t *, void*)
siginfo_t {
int si_int; /* POSIX.1b signal */
void *si_ptr; /* POSIX.1b signal */
sigval_t si_value; /* Signal value */
...
}
sa_flags = SA_SIGINFO
3信号处理之:避免异步IO的类型,SIGCHLD信号处理相关推荐
- 基础服务器 IO 模型 Proactor 模型 Reactor 模型 IO 多路复用 异步 IO 模型 Linux 服务器开发 网络编程服务器模型
本文主要记录服务器的 IO 模型的类型(从多路复用,异步 IO 讲到 Proactor Reactor 模型),包括 Real World nginx 和 apache ,kafka 等分析,配备自洽 ...
- Node的异步与java的异步_node中异步IO的理解
解释性语言和编译型语言的区别: 计算器不能直接的理解高级语言,只能理解机器语言,所以必须把高级语言翻译为机器语言,翻译的方式有两种,一个是编译,一个是解释. 解释性语言的程序不需要编译,它是在运行程序 ...
- 操作系统学习:Linux0.12文件异步IO
本文参考书籍 1.操作系统真相还原 2.Linux内核完全剖析:基于0.12内核 3.x86汇编语言 从实模式到保护模式 4.Linux内核设计的艺术 ps:基于x86硬件的pc系统 Linux0.1 ...
- 异步IO(协程,消息循环队列)
同步是CPU自己主动查看IO操作是否完成,异步是IO操作完成后发出信号通知CPU(CPU是被通知的) 阻塞与非阻塞的区别在于发起IO操作之后,CPU是等待IO操作完成再进行下一步操作,还是不等待去做其 ...
- Node - 异步IO和事件循环
前言 学习Node就绕不开异步IO, 异步IO又与事件循环息息相关, 而关于这一块一直没有仔细去了解整理过, 刚好最近在做项目的时候, 有了一些思考就记录了下来, 希望能尽量将这一块的知识整理清楚, ...
- Day10-Python3基础-协程、异步IO、redis缓存、rabbitMQ队列
内容目录: Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko S ...
- 【多线程】0.理解一下5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO
5种IO模型.阻塞IO和非阻塞IO.同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度.环境不一样.所以,我们先说明基本的IO操作及环境. 本文是在<UNIX网络编 ...
- python异步io多文件_Python 异步 IO 性能又上一层楼
最近看源码的过程中,发现了一个比较有意思的库,aiomultiprocess,我认为他确实是 Python 升级到 3.8 之后一个特性的总结库,包括静态检查和性能提升. 这个是作者提供的一个 IO ...
- 重叠IO模型-异步IO
重叠IO模型-异步IO http://laiba.tianya.cn/laiba/CommMsgs?cmm=959&tid=2701316824681802728 说到重叠模型首先还是提一下异 ...
最新文章
- There is no Citrix MetaFrame server configured on the specified address错误的解决方法
- UITableView HeaderView,FooterView 使用SnapKit布局导致约束异常
- Equifax再陷风波:一门户网站管理员密码是admin/admin
- 只给测试集不给训练集,要怎么做自己的物体检测器?
- 学python的好处-python语言的优点和缺点
- vmware下/mnt/hgfs下为空的问题
- Sublime Text 无法使用Package Control或插件安装失败的解决方法【转】
- Asp.net 安装包制作 (转)
- 今天你们表现的真棒!!!
- 《大数据》多名编委当选CCF第十二届理事会成员!
- C# 自动投票和手机号码归属地查询 - 简单程序源码分享(高手飘过)
- 2021-06-27变量的作用域
- 深入剖析 Sharepoint 企业项目管理与 SharePoint(转)
- 最简单的YUV422转jpg的例程
- 数字图像字符识别——数字识别
- Android Gradle manifestPlaceholders 的妙用
- ARM CM0 push和pop指令
- Python最抢手、Java最流行、Go最有前途,7000位程序员揭秘2019软件开发现状
- CrystalDiskInfo硬盘检测工具 标准版及萌妹版
- 增强 扫描王 源码_OpenCV探索之路(二十二):制作一个类“全能扫描王”的简易扫描软件...
热门文章
- JavaScript实现graphBridges图桥算法(附完整源码)
- OpenCASCADE:常用Inspector控件之3D 视图
- OpenCASCADE绘制测试线束:形状修复命令之转换命令
- OpenCASCADE绘制测试线束:数据交换命令之XDE 图层命令
- OpenCASCADE:调试工具和提示
- boost::process::windows相关的测试程序
- boost::mpl模块实现erase相关的测试程序
- boost::hana::fold_left用法的测试程序
- boost::math::bernoulli_b2n用法的测试程序
- Boost:path的测试程序