SIGCHLD函数
SIGCHLD的产生条件
子进程终止时
子进程接收到SIGSTOP信号停止时
子进程处在停止态,接受到SIGCONT后唤醒时
借助SIGCHLD信号回收子进程
子进程结束运行,其父进程会收到SIGCHLD信号。该信号的默认处理动作是忽略。可以捕捉该信号,在捕捉函数中完成子进程状态的回收。
/***
sigchild.c
***/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h> void sys_err(char *str)
{
perror(str);
exit();
}
void do_sig_child(int signo)
{
int status; pid_t pid;
while ((pid = waitpid(, &status, WNOHANG)) > ) {
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 = ; i < ; i++) {
if ((pid = fork()) == )
break;
else if (pid < )
sys_err("fork");
}
if (pid == ) {
int n = ;
while (n--) {
printf("child ID %d\n", getpid());
sleep();
}
return i+;
} else if (pid > ) {
struct sigaction act;
act.sa_handler = do_sig_child;
sigemptyset(&act.sa_mask);
act.sa_flags = ;
sigaction(SIGCHLD, &act, NULL); while () {
printf("Parent ID %d\n", getpid());
sleep();
}
}
return ;
}
/***
my_sigchild.c
***/
#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();
} void do_sig_child(int signo)
{
int status;
pid_t pid; while( (pid = waitpid(,&status,WNOHANG)) > )
{
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()
{
pid_t pid;
int i; for(i = ; i < ; i++)
{
if((pid = fork()) == )
{
break;
}
else if(pid < )
{
sys_err("fork");
}
} if( == pid)
{
int n = ;
while(n--)
{
printf("child ID %d\n",getpid());
sleep();
}
return i+;
}
else if(pid > )
{
struct sigaction act;
act.sa_handler = do_sig_child;
sigemptyset(&act.sa_mask); while()
{
printf("Parent ID %d\n",getpid());
sleep();
} }
return ;
}
分析该例子。结合 17)SIGCHLD 信号默认动作,掌握父使用捕捉函数回收子进程的方式。 【sigchild.c】
如果每创建一个子进程后不使用sleep可以吗?可不可以将程序中,捕捉函数内部的while替换为if?为什么?
if ((pid = waitpid(0, &status, WNOHANG)) > 0) { ... }
思考:信号不支持排队,当正在执行SIGCHLD捕捉函数时,再过来一个或多个SIGCHLD信号怎么办?
SIGCHLD函数的更多相关文章
- Linux下的进程环境
僵尸进程.孤儿进程.守护进程.进程组.会话.前台进程组.后台进程组 1,僵尸进程 子进程结束,父进程没有明确的答复操作系统内核:已收到子进程结束的消息.此时操作系统内核会一直保存该子进程的部分PCB信 ...
- 三十一、Linux 进程与信号——SIGCHLD 信号、kill和raise函数以及alarm函数
31.1 SIGCHLD 信号 子进程状态发生变化(子进程结束)产生该信号,父进程需要使用 wait 调用来等待子进程结束并回收它. 避免僵尸进程 #include <stdio.h> # ...
- SIGCHLD和wait/waipid函数的关系
SIGCHILD只是在子进程退出的时候发送给父进程的一个信号值,这是一种异步通知父进程的方式.父进程可以捕获,忽略这个信号,默认动作是忽略此信号. 常用的使用方式是,当SIGCHILD信号发生时候,主 ...
- 调用wait的SIGCHLD信号处理函数
#include <stdio.h> #include <sys/wait.h> void sig_chld(int signo) { pid_t pid; int stat; ...
- 调用waitpid的SIGCHLD信号处理函数
#include <stdio.h> #include <sys/wait.h> void sig_chld(int signo) { pid_t pid; int stat; ...
- Linux C--信号 sigaction函数
使用 sigaction 函数: signal 函数的使用方法简单,但并不属于 POSIX 标准,在各类 UNIX 平台上的实现不尽相同,因此其用途受 到了一定的限制.而 POSIX 标准定义的信号处 ...
- 关于linux下system()函数的总结
导读 曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.这里必须要搞懂system()函数,因为有时你不得不面对它. 先来看一下system()函数的简单 ...
- unp TCP 客户端服务器回射程序中对SIGCHLD信号的处理
第五章中,有一个例子模拟客户端并发的终止TCP连接,服务器捕捉并处理SIGCHLD信号并调用waitpid函数防止僵死进程的出现.信号处理函数中核心的一句是: , &statloc, WNOH ...
- Linux 信号详解一(signal函数)
信号列表 SIGABRT 进程停止运行 SIGALRM 警告钟 SIGFPE 算述运算例外 SIGHUP 系统挂断 SIGILL 非法指令 SIGINT 终端中断 SIGKILL 停止进程(此信号不能 ...
随机推荐
- 原生js分页器插件
window.page = function page(ele, para) { this.ele = document.querySelector(ele); this.options = { co ...
- MySQL 触发器的使用
MySQL 基础篇 三范式 MySQL 军规 MySQL 配置 MySQL 用户管理和权限设置 MySQL 常用函数介绍 MySQL 字段类型介绍 MySQL 多列排序 MySQL 行转列 列转行 M ...
- css 小图标 & iconfont 字体图标
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! iconfont 字体图标 我们的需求中,很多时候会看到一些小的图形,或者叫图标,比如天猫网站中: ...
- 轻松搭建CAS 5.x系列(4)-Java客户端程序接入CAS单点登录,Hello World版
概述说明 按照本系列的前3篇文章描述的步骤,我们已经搭建好cas sso server.那应用程序怎么接入到实现sso呢? (如果您还没有搭建cas server,可以到<轻松搭建CAS 5.x ...
- 通俗化理解Spring3 IoC的原理和主要组件
♣什么是IoC? ♣通俗化理解IoC原理 ♣IoC好处 ♣工厂模式 ♣IoC的主要组件 ♣IoC的应用实例 ♣附:实例代码 1.什么是IoC(控制反转)? Spring3框架的核心是实现控制反转( ...
- Node +FastDFS 实现文件的上传下载
npm install fastdfsl-client //--------------------------------配置文件---------------------------------- ...
- Python练习_Python初识_day2
题目 1.作业 1.判断下列逻辑语句的True,False. 1)1 > 1 or 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < ...
- 函数实现计算等差数列的第n项
等差数列的第n项 描述 等差数列是指从第二项起,每一项与它的前一项的差等于同一个常数的一种数列,这个常数叫做等差数列的公差. ...
- 基于【 Docker】三 || Docker的基本操作
一.Docker常用命令 1.搜索镜像:docker search 镜像名称 2.下载镜像:docker pull 镜像名称:版本号 3.查看镜像:docker images 4.删除镜像:docke ...
- numpy相关使用
相关学习资料 : numpy中文网 https://www.numpy.org.cn/ 1 numpy索引区间为左闭右开,第一个索引能取到,第二个索引取不到 索引内可加步长 如 import nump ...