UNIX环境高级编程笔记(14)- 函数sigsuspend 实现父进程子进程同步
前言
本章主要介绍sigsuspend函数以及实现父进程子进程通过信号的同步。
一、函数sigsuspend
#include<signal.h>
int sigsuspend(const sigset_t *sigmask);
二、sigsuspend介绍
1.将进程的信号屏蔽字设置为由sigmask指向的值。在捕捉到一个信号或发生了一个会终止该进程的信号之前,该进程被挂起。如果捕捉到一个信号而且从该信号处理程序返回,则sigsuspend返回,并且将该进程的信号屏蔽字设置为调用sigsuspend之前的值。
2.此函数没有成功返回值。如果它返回到调用者,则总是返回-1,并将errno设置为EINTR(表示一个被中断的系统调用)。
3.等待信号发生时希望进程休眠,使用sigsuspend函数比较合适,此函数在一个原子操作中先恢复信号屏蔽字,然后使进程休眠;
4.sigsuspend实际是将sigprocmask和pause结合起来原子操作;
三、例程
1.sigsupend实现父进程子进程同步
代码如下(示例):
static volatile sig_atomic_t sigflag;
static sigset_t newmask,oldmask,zeromask;static void sig_usr1(int signo)
{sigflag = 1;
}
void TELL_WAIT(void)
{if(signal(SIGUSR1,sig_usr1) == SIG_ERR)err_sys("signal(SIGUSR1) error");if(signal(SIGUSR2,sig_usr1) == SIG_ERR)err_sys("signal(SIGUSR2) error");sigemptyset(&zeromask);sigemptyset(&newmask);sigaddset(&newmask,SIGUSR1);sigaddset(&newmask,SIGUSR2);if(sigprocmask(SIG_BLOCK,&newmask,&oldmask) < 0)err_sys("SIG_BLOCK error");
}
void TELL_PARENT(pid_t pid)
{kill(pid,SIGUSR2);
}
void WAIT_PARENT(void)
{while(sigflag==0)sigsuspend(&zeromask);sigflag = 0;if(sigprocmask(SIG_SETMASK,&oldmask,NULL) < 0)err_sys("SIG_MASK error");
}
void TELL_CHILD(pid_t pid)
{kill(pid,SIGUSR1);
}
void WAIT_CHILD(void)
{while(sigflag == 0)sigsuspend(&zeromask);sigflag = 0;if(sigprocmask(SIG_SETMASK,&oldmask,NULL) < 0)err_sys("SIG_SETMASK error");
}
static void charatatime(char* str)
{char *ptr;int c;setbuf(stdout,NULL);for(ptr = str;(c=*ptr++)!=0;)putc(c,stdout);
}void unix_10_24_sigsuspend(void)
{pid_t pid;TELL_WAIT();if((pid = fork()) < 0)err_sys("fork error");else if(pid == 0){WAIT_PARENT();charatatime("output from child\n");}else{charatatime("output from parent\n");TELL_CHILD(pid);}sleep(1);exit(0);
}
#define UNIX_10_24_SIGSUSPEND
int main(int argc, char *argv[])
{
#ifdef UNIX_10_24_SIGSUSPENDunix_10_24_sigsuspend();
#endifprintf("MAIN END\n");return 0;
}
结果:
总结
本章主要介绍了一种用信号的方式来处理父子进程同步的问题。
UNIX环境高级编程笔记(14)- 函数sigsuspend 实现父进程子进程同步相关推荐
- UNIX环境高级编程笔记
1.setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, len); SO_REUSEADDR套接口选项允许为以下四个不同的目的提供服务: ...
- Unix环境高级编程 笔记
Unix环境高级编程(第二版)学习笔记 这是一次较长时间的整理,然而跳跃了一些章节和很多知识点,仍然是很不完善很不全面的. 前言 操作系统某些问题 严格意义上,可将操作系统定义为一种软件,它控制计算机 ...
- UNIX环境高级编程笔记之文件I/O
一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是"哇"这种很吃惊的表情.其实大概三年前,那会 ...
- 函数sleep、nanosleep和clock_nanosleep(UNIX环境高级编程笔记)
#include <unistd.h> unsigned int sleep(unsigned int seconds); 返回值:0或未休眠完的秒数 此函 ...
- UNIX环境高级编程笔记(2)- STDIN_FILENO、STDOUT_FILENO和stdin、stdout的区别
目录 前言 一.STDIN_FILENO.STDOUT_FILENO介绍 二.stdin.stdout介绍 三.代码例程 1.文件描述符的使用 2.流的使用 3.代码标记 总结 前言 本章主要通过UN ...
- UNIX环境高级编程笔记之进程控制
本章重点介绍了进程控制的几个函数:fork.exec族._exit.wait和waitpid等,主要需要掌握的是父进程和子进程之间的运行机制,怎么处理进程的正常和异常终止.以及怎么让进程执行不同的程序 ...
- Unix环境高级编程笔记:12、高级IO
2019独角兽企业重金招聘Python工程师标准>>> 1.非阻塞IO 系统调用分成"低速"系统调用和其他系统调用.低速系统调用是可能会使进程永远阻塞的一类系统调 ...
- 文件io(二)--unix环境高级编程笔记
在linux中,打开的文件组织结构如下: 与打开的文件相关的有三个数据结构,就是上图中的三部分. 在linux中,有一个进程表,每一个进程在进程表中有一个表项.每一个进程表项中都维护着一张打开文件的描 ...
- 5w字总结 Unix系统编程学习笔记(面试向)(Unix环境高级编程/Unix环境程序设计)
文章目录 一.计算 C语言的数据表示与处理 计算 C语言的基本运算操作 内存表和符号表 类型转换 函数类型的分析 指令 复合指令 句法 函数 函数激活(Activation Record) 函数激活定 ...
最新文章
- spark算子_Spark常用算子
- 乘法器之五(混和式乘法器(Hybrid multiplication))
- 微软Expression Blend功能介绍
- oracle 各种日期函数格式和操作
- 【HDU - 6184】Counting Stars(三元环计数,二分,优化暴力,O(m*sqrt(m)),图论)
- Flume将A服务器上的日志实时采集到B服务器
- 如何绘制吞吐率曲线图
- 使用zabbix监控MongoDB
- Elasticsearch地理位置
- 关于JavaScript中return的使用情况
- 【异常 1】什么是异常
- WordPress建立数据库连接时出错解决办法
- Java 设置添加ckeditor图片上传功能
- java 三角形类 Triangle
- 建网站如何选择空间?
- 【java.lang.ref】FinalReference Finalizer FinalizerThread
- 【C语言】函数的理解——关于函数的声明
- 时间序列预测之移动平均法(MA)
- 中勒索病毒后的正确操作姿势
- MySQL数据库,数据的约束
热门文章
- 在MySQL中第一章选择题_北大青鸟第二学期 123章数据库选择题
- html5对锚的更改,HTML5之锚链接
- 使用串口转USB连接树莓派
- 重装系统后出现服务器正在运行中,win7系统重装完后怎么一直显示正在启动 - 卡饭网...
- 计算机大神专业小说,5本高人气系统流小说,无敌满足你,一路爽到底,全部是大神出品...
- 《麦田里的守望者》阅读笔记
- 数字格式化 * 有一个小数,123.45678 要求保留两位
- 量化投资python_量化投资与python
- 品味kettle--(一)用eclipse 搭建源码
- markdown、html转义特殊字符代码大全