《unix高级环境编程》信号——sigsuspend 函数

sigsuspend 函数

       更改进程的信号屏蔽字可以阻塞所选择的信号,或解除对它们的阻塞,使用这种技术可以保护不希望由信号中断的代码临界区。如果希望对一个信号解除阻塞,然后pause 等待以前被阻塞的信号发生,就是把“解除信号屏蔽”和“挂起等待信号”这两步能合并成一个原子操作。sigsuspend 函数能够实现该功能,即包含了pause的挂起等待功能,同时临时解除对某个信号的屏蔽。以下是该函数的原型:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <signal.h>  
  2. int sigsuspend(const sigset_t *sigmask);//返回值:-1,并将errno设置为EINTR;  

        跟  pause  一样, sigsuspend  没有成功返回值,只有执行了一个信号处理函数之后 sigsuspend  才返回,返回值为-1,并将 errno  设置为  EINTR 。调用 sigsuspend  时,进程的信号屏蔽字由 sigmask  参数指定,可以通过指定 sigmask  来临时解除对某个信号的屏蔽,然后挂起等待,当 sigsuspend  返回时,进程的信号屏蔽字恢复为原来的值。

测试程序:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <signal.h>  
  2. /* 
  3. int sigsuspend(const sigset_t *sigmask);//返回值:-1,并将errno设置为EINTR; 
  4. */  
  5. #include "apue.h"  
  6. #include "pr_mask.h"  
  7.   
  8. static void sig_func(int signo);  
  9.   
  10. int main(void)  
  11. {  
  12.     sigset_t newmask, oldmask, waitmask;  
  13.   
  14.     pr_mask("Program start: ");  
  15.   
  16.     if(signal(SIGINT,sig_func) == SIG_ERR)  
  17.         err_sys("signal error");  
  18.     sigemptyset(&newmask);//初始化信号集  
  19.     sigaddset(&newmask,SIGINT);//添加SIGINT信号  
  20.   
  21.     sigemptyset(&waitmask);  
  22.     sigaddset(&waitmask,SIGUSR1);  
  23.   
  24.     //屏蔽信号  
  25.     /* 
  26.      * Block SIGINT and save current signal mask 
  27.      */  
  28.     if(sigprocmask(SIG_BLOCK,&newmask,&oldmask) < 0)  
  29.         err_sys("SIG_BLOCK error");  
  30.   
  31.     pr_mask("in critical region: ");  
  32.   
  33.     //临时修改进程信号屏蔽字,在捕捉信号之前,将进程挂起等待  
  34.     /* 
  35.      * pause, allowing all of signals except SIGUSR1 
  36.      */  
  37.     if(sigsuspend(&waitmask) != -1)  
  38.         err_sys("sigsuspend error");  
  39.     pr_mask("after return from sigsuspend: ");  
  40.     /* 
  41.      * reset signal mask which unblocks SIGINT 
  42.      */  
  43.     if(sigprocmask(SIG_SETMASK,&oldmask,NULL) < 0)  
  44.         err_sys("SIG_SETMASK error");  
  45.   
  46.     pr_mask("program exit: ");  
  47.   
  48.     exit(0);  
  49. }  
  50.   
  51. static void sig_func(int signo)  
  52. {  
  53.     pr_mask("\nin sig_func: ");  
  54. }  
输出结果:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. $ ./sigsuspend  
  2. Program start:   
  3. in critical region: SIGINT    
  4. ^C  
  5. in sig_func: SIGINT SIGUSR1   
  6. after return from sigsuspend: SIGINT      
  7. program exit:  

  1. 首先设置信号 SIGINT为信号屏蔽字进行阻塞;
  2. 当程序执行了 sigsuspend 后,临时使 SIGUSR1 成为信号屏蔽字进行阻塞,对 SIGINT 解除阻塞,并且挂起进程,等待信号输入;
  3. 我们在终端中输入ctrl-C ,即输入一个中断信号,进程捕捉到中断信号,调用捕捉函数sig_func 进行处理,处理完中断信号后sigsuspend 函数返回-1。此时,进程的信号屏蔽字恢复为原来的值SIGINT
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书全面介绍了UNIX系统的程序设计界面—系统调用界面和标准C库提供的许多函数。 本书的前15章着重于理论知识的阐述,主要内容包括UNIX文件和目录、进程环境、进程控制、 进程间通信以及各种I/O。在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库, PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威, 概念清晰精辟,一直以来被誉为UNIX编程的“圣经”,对于所有UNIX程序员—无论是初学者还是专家级人士 —都是一本无价的参考书籍。 目 录 译者序 译者简介 前言 第1章 UNIX基础知识 1 1.1 引言 1 1.2 登录 1 1.2.1 登录名 1 1.2.2 shell 1 1.3 文件和目录 2 1.3.1 文件系统 2 1.3.2 文件名 2 1.3.3 路径名 2 1.3.4 工作目录 4 1.3.5 起始目录 4 1.4 输入和输出 5 1.4.1 文件描述符 5 1.4.2 标准输入、标准输出和标准 出错 5 1.4.3 不用缓存的I/O 5 1.4.4 标准I/O 6 1.5 程序和进程 7 1.5.1 程序 7 1.5.2 进程和进程ID 7 1.5.3 进程控制 7 1.6 ANSI C 9 1.6.1 函数原型 9 1.6.2 类属指针 9 1.6.3 原始系统数据类型 10 1.7 出错处理 10 1.8 用户标识 11 1.8.1 用户ID 11 1.8.2 组ID 12 1.8.3 添加组ID 12 1.9 信号 12 1.10 UNIX时间值 14 1.11 系统调用和库函数 14 1.12 小结 16 习题 16 第2章 UNIX标准化及实现 17 2.1 引言 17 2.2 UNIX标准化 17 2.2.1 ANSI C 17 2.2.2 IEEE POSIX 18 2.2.3 X/Open XPG3 19 2.2.4 FIPS 19 2.3 UNIX实现 19 2.3.1 SVR4 20 2.3.2 4.3+BSD 20 2.4 标准和实现的关系 21 2.5 限制 21 2.5.1 ANSI C限制 22 2.5.2 POSIX限制 22 2.5.3 XPG3限制 24 2.5.4 sysconf、pathconf 和fpathconf 函数 24 2.5.5 FIPS 151-1要求 28 2.5.6 限制总结 28 2.5.7 未确定的运行时间限制 29 2.6 功能测试宏 32 2.7 基本系统数据类型 32 2.8 标准之间的冲突 33 2.9 小结 34 习题 34 第3章 文件I/O 35 3.1 引言 35 3.2 文件描述符 35 3.3 open函数 35 3.4 creat函数 37 3.5 close函数 37 3.6 lseek函数 38 3.7 read函数 40 3.8 write函数 41 3.9 I/O的效率 41 3.10 文件共享 42 3.11 原子操作 45 3.11.1 添加至一个文件 45 3.11.2 创建一个文件 45 3.12 dup和dup2函数 46 3.13 fcntl函数 47 3.14 ioctl函数 50 3.15 /dev/fd 51 3.16 小结 52 习题 52 第4章 文件和目录 54 4.1 引言 54 4.2 stat, fstat和lstat函数 54 4.3 文件类型 55 4.4 设置-用户-ID和设置-组-ID 57 4.5 文件存取许可权 58 4.6 新文件和目录的所有权 60 4.7 access函数 60 4.8 umask函数 62 4.9 chmod和fchmod函数 63 4.10 粘住位 65 4.11 chown, fchown和 lchown函数 66 4.12 文件长度 67 4.13 文件截短 68 4.14 文件系统 69 4.15 link, unlink, remove和rename 函数 71 4.16 符号连接 73 4.17 symlink 和readlink函数 76 4.18 文件的时间 76 4.19 utime函数 78 4.20 mkdir和rmdir函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值