1. 测试代码:

#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<errno.h>
#include<unistd.h>void catch_sigalrm(int signo)
{;
}unsigned int mysleep(unsigned int seconds)
{struct sigaction newact, oldact;sigset_t newmask, oldmask, suspmask;unsigned int unmask;//1. 为SIGALRM设置捕捉函数,一个空函数newact.sa_handler = sig_alrm;sigemptyset(&newact.sa_mask);newact.sa_flags = 0;sigaction(SIGALRM, &newact, &oldact);// 2. 设置阻塞信号集,阻塞SIGLARM信号sigemptyset(&newmask);sigaddset(*newact.sa_mask, SIGALRM);sigpromask(SIG_BLOCK, &newact, &oldact);   //信号屏蔽字// 3、定时h秒,到时可以产生SIGALRM信号alarm(nsecs);/* 4. 构造一个调用sigsuspend临时有效的阻塞信号集,*   临时阻塞信号集里面解除SIGALRM的阻塞*/suspmask = oldmask;sigdelset(&suspmask, SIGALRM);/* 5. sigsuspend调用期间,采用临时阻塞信号集suspmask替换原有阻塞信号集*   这个信号集中不包含SIGALRM信号,同时挂起等待*   当sigsuspend被信号唤醒返回时,恢复原有的阻塞信号集*/sigsuspend(&suspmask);unslept = alarm(0);//6. 恢复SIGALRM原有的处理动作,呼应前面注释1sigaction(SIGLARM, &oldact, NULL);//7. 解除对SIGALRM的阻塞,呼应前面注释2 sigprocmask(SIG_SETMASK, &oldmask, NULL);return (unslept);
}int main()
{while (1) {mysleep(3);printf("----------------------------\n");}return 0;
}

2. 测试代码:

#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>int n = 0, flag = 0;void sys_err(char *str)
{perror(str);exit(1);
}void do_sig_child(int num)
{printf("I am child %d\t%d\n", getpid(), n);n += 2;flag = 1;sleep(1);
}void do_sig_parent(int num)
{printf("I am parent %d\t%d\n", getpid(), n);n += 2;flag = 1; //数数完成 sleep(1);
}int main(void)
{pid_t pid;struct sigaction act;if ((pid = fork()) < 0)sys_err("fork");else if (pid > 0) {n = 1;sleep(1);act.sa_handler = do_sig_parent;sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGUSR2, &act, NULL); //祖册自己的信号捕捉函数 父用SIGUSR2信号 do_sig_parent(0);while (1) {/* wait for signal*/if (flag == 1) {kill(pid, SIGUSR1);  //父进程数数完成flag = 0;            //标志已经给子进程发送信号完信号 }}}else if (pid == 0) {n = 2;act.sa_handler = do_sig_child;sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGUSR1, &act, NULL);while (1) {/* wait for signal*/if (flag == 1) {kill(getppid(), SIGUSR2);flag = 0;           //标志已经给父进程发送信号了 }}}return 0;
}

测试代码:

#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>int n = 0, flag = 0;void sys_err(char *str)
{perror(str);exit(1);
}void do_sig_child(int num)
{printf("I am child %d\t%d\n", getpid(), n);n += 2;flag = 1;// sleep(1);
}void do_sig_parent(int num)
{printf("I am parent %d\t%d\n", getpid(), n);n += 2;flag = 1; //数数完成 //sleep(1);
}int main(void)
{pid_t pid;struct sigaction act;if ((pid = fork()) < 0)sys_err("fork");else if (pid > 0) {n = 1;sleep(1);act.sa_handler = do_sig_parent;sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGUSR2, &act, NULL); //祖册自己的信号捕捉函数 父用SIGUSR2信号 do_sig_parent(0);while (1) {/* wait for signal*/if (flag == 1) {kill(pid, SIGUSR1);  //父进程数数完成flag = 0;            //标志已经给子进程发送信号完信号 }}}else if (pid == 0) {n = 2;act.sa_handler = do_sig_child;sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGUSR1, &act, NULL);while (1) {/* wait for signal*/if (flag == 1) {kill(getppid(), SIGUSR2);flag = 0;           //标志已经给父进程发送信号了 }}}return 0;
}

函数sigsuspend相关推荐

  1. UNIX环境高级编程笔记(14)- 函数sigsuspend 实现父进程子进程同步

    前言 本章主要介绍sigsuspend函数以及实现父进程子进程通过信号的同步. 一.函数sigsuspend #include<signal.h> int sigsuspend(const ...

  2. 函数sigsuspend sigprocmask的使用

    一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集,调用函数sigprocmask可以检测或更改其信号屏蔽字 #include <signal.h> int sigprocmas ...

  3. sigsuspend sigprocmask函数的用法

    一个进程的信号屏蔽字规定了当前堵塞而不能递送给该进程的信号集.调用函数sigprocmask能够检測或更改其信号屏蔽字,或者在一个步骤中同一时候运行这两个操作. #include <signal ...

  4. 信号驱动任务执行(pause、sigsuspend函数)

    信号驱动任务指的是通过信号来驱动任务的执行,每发送一次信号,任务就执行一次.实现该目的所需的函数就是 pause 或者 sigsuspend,pause和sigsuspend函数可以暂停当前进程,直至 ...

  5. 10.16 sigsuspend函数

    我们已经学习了如何修改进程的信号掩码,实现指定信号的阻塞与接触阻塞.我们可以使用这一技术来保护临界区域的代码(当在这一段区域内执行代码的时候哦,我们不希望被信号中断),但是如果我们想要接触一个信号的阻 ...

  6. sigsuspend 函数和 abort 函数

    pause 函数可以阻塞进程以等待一个信号的发生,但如果该信号是阻塞的,那么该信号的传递就会被推迟直到解除阻塞.对应用程序而言,就好像该信号发生在解除阻塞和 pause 之间(取决于内核如何实现信号) ...

  7. Linux进程间通信(二):信号集函数 sigemptyset()、sigprocmask()、sigpending()、sigsuspend()...

    我们已经知道,我们可以通过信号来终止进程,也可以通过信号来在进程间进行通信,程序也可以通过指定信号的关联处理函数来改变信号的默认处理方式,也可以屏蔽某些信号,使其不能传递给进程.那么我们应该如何设定我 ...

  8. linux c 之sigsuspend 进程阻塞

    函数原型: #include <signal.h> int sigsuspend(const sigset_t *mask); 作用: 用于在接收到某个信号之前,临时用mask替换进程的信 ...

  9. UNIX再学习 -- 信号处理

    一.闹钟和睡眠 1.函数 alarm #include <unistd.h> unsigned int alarm(unsigned int seconds); 返回值:返回 0 或先前所 ...

最新文章

  1. .net中窗体之间的数据交换总结
  2. python3 console input_Python console.colorize方法代码示例
  3. c#执行存储过程的简单实例
  4. Java常见的几种设计模式
  5. python如何和qt交互_Python 之Pyqt5操作交互处理,原来这么简单!
  6. 操作系统学习---虚拟内存
  7. Android UI 备忘:DrawerLayout
  8. android 多线程 加锁,android 多线程 — 从一个小例子再次品位多线程
  9. 沟通与设计讨论总结:设计师不能不知道的10个沟通秘诀
  10. MySQL-MMM架构部署
  11. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第6节 Lambda表达式_3_编程思想转换体验Lambda的更优写法...
  12. eeglab导出图片
  13. OpenCV图像处理--opencv摄像头播放视频
  14. Player-Controlled Cameras
  15. Bat文件的创建及其命令大全
  16. react-native-webrtc之采坑之旅
  17. 深度学习是表示学习的经典代表(浅谈什么是深度学习)
  18. python3.6源码编译安装 解决SSL报错
  19. 《淘宝网开店 拍摄 修图 设计 装修 实战150招》一一1.9 逆光拍摄透明体
  20. MQ系列传感器电路图

热门文章

  1. 字体Times New Roman
  2. welcome to my blog
  3. 工业机器人用铸铁牌号_常用铸铁牌号
  4. printf函数输出超出int时怎么办
  5. 退出页面删除cookie_Cookie 机制
  6. linux更改用户名_破旧安卓手机第二春,在安卓手机上使用Linux_deploy运行Linux
  7. 《线程管理:线程基本操作》
  8. operator.ne_Python operator.ne()函数与示例
  9. 如何获取ubuntu源码包里面的源码进行编译
  10. 递归-裴波那契数列(代码、分析、汇编)