前言

本章主要介绍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 实现父进程子进程同步相关推荐

  1. UNIX环境高级编程笔记

    1.setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, len);   SO_REUSEADDR套接口选项允许为以下四个不同的目的提供服务:   ...

  2. Unix环境高级编程 笔记

    Unix环境高级编程(第二版)学习笔记 这是一次较长时间的整理,然而跳跃了一些章节和很多知识点,仍然是很不完善很不全面的. 前言 操作系统某些问题 严格意义上,可将操作系统定义为一种软件,它控制计算机 ...

  3. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是"哇"这种很吃惊的表情.其实大概三年前,那会 ...

  4. 函数sleep、nanosleep和clock_nanosleep(UNIX环境高级编程笔记)

    #include <unistd.h> unsigned int sleep(unsigned int seconds);               返回值:0或未休眠完的秒数   此函 ...

  5. UNIX环境高级编程笔记(2)- STDIN_FILENO、STDOUT_FILENO和stdin、stdout的区别

    目录 前言 一.STDIN_FILENO.STDOUT_FILENO介绍 二.stdin.stdout介绍 三.代码例程 1.文件描述符的使用 2.流的使用 3.代码标记 总结 前言 本章主要通过UN ...

  6. UNIX环境高级编程笔记之进程控制

    本章重点介绍了进程控制的几个函数:fork.exec族._exit.wait和waitpid等,主要需要掌握的是父进程和子进程之间的运行机制,怎么处理进程的正常和异常终止.以及怎么让进程执行不同的程序 ...

  7. Unix环境高级编程笔记:12、高级IO

    2019独角兽企业重金招聘Python工程师标准>>> 1.非阻塞IO 系统调用分成"低速"系统调用和其他系统调用.低速系统调用是可能会使进程永远阻塞的一类系统调 ...

  8. 文件io(二)--unix环境高级编程笔记

    在linux中,打开的文件组织结构如下: 与打开的文件相关的有三个数据结构,就是上图中的三部分. 在linux中,有一个进程表,每一个进程在进程表中有一个表项.每一个进程表项中都维护着一张打开文件的描 ...

  9. 5w字总结 Unix系统编程学习笔记(面试向)(Unix环境高级编程/Unix环境程序设计)

    文章目录 一.计算 C语言的数据表示与处理 计算 C语言的基本运算操作 内存表和符号表 类型转换 函数类型的分析 指令 复合指令 句法 函数 函数激活(Activation Record) 函数激活定 ...

最新文章

  1. spark算子_Spark常用算子
  2. 乘法器之五(混和式乘法器(Hybrid multiplication))
  3. 微软Expression Blend功能介绍
  4. oracle 各种日期函数格式和操作
  5. 【HDU - 6184】Counting Stars(三元环计数,二分,优化暴力,O(m*sqrt(m)),图论)
  6. Flume将A服务器上的日志实时采集到B服务器
  7. 如何绘制吞吐率曲线图
  8. 使用zabbix监控MongoDB
  9. Elasticsearch地理位置
  10. 关于JavaScript中return的使用情况
  11. 【异常 1】什么是异常
  12. WordPress建立数据库连接时出错解决办法
  13. Java 设置添加ckeditor图片上传功能
  14. java 三角形类 Triangle
  15. 建网站如何选择空间?
  16. 【java.lang.ref】FinalReference Finalizer FinalizerThread
  17. 【C语言】函数的理解——关于函数的声明
  18. 时间序列预测之移动平均法(MA)
  19. 中勒索病毒后的正确操作姿势
  20. MySQL数据库,数据的约束

热门文章

  1. 在MySQL中第一章选择题_北大青鸟第二学期 123章数据库选择题
  2. html5对锚的更改,HTML5之锚链接
  3. 使用串口转USB连接树莓派
  4. 重装系统后出现服务器正在运行中,win7系统重装完后怎么一直显示正在启动 - 卡饭网...
  5. 计算机大神专业小说,5本高人气系统流小说,无敌满足你,一路爽到底,全部是大神出品...
  6. 《麦田里的守望者》阅读笔记
  7. 数字格式化 * 有一个小数,123.45678 要求保留两位
  8. 量化投资python_量化投资与python
  9. 品味kettle--(一)用eclipse 搭建源码
  10. markdown、html转义特殊字符代码大全