首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

sigprocmask函数应用实例

2012-07-05 
sigprocmask函数使用实例?#include signal.hint sigprocmask( int how, const sigset_t * restrict set,

sigprocmask函数使用实例

?

#include <signal.h>int sigprocmask( int how, const sigset_t * restrict set, sigset_t *restrict oset);返回值:若成功则返回0,若失败则返回-1首先,如果oset是非空指针,那么进程的当前信号屏蔽字通过oset返回其次,若set是一个非空指针,则参数how指示如何修改当前信号屏蔽字。How的三种取值:SIG_BLOCK  该进程新的信号平别字是起当前信号平别字和set指向信号集的并集。set包含了我们希望阻塞的附加新号。SIG_UNBLOCK 该进程新的信号屏蔽字是其当前信号屏蔽字和set所指向信号集部际的交集。set包含了我们希望解除阻塞的信号。SIG_SETMASK 该进程新的信号屏蔽字将被set指向的信号集的值代替。

?一个例子:P259

?

#include "apue.h"#include "myerr.h"static void sig_quit(int);int main( void ) {sigset_t newmask;sigset_t oldmask;sigset_t pendmask;if ( signal(SIGQUIT, sig_quit) == SIG_ERR){err_sys("can't catch SIGQUIT");}/** Block SIGQUIT and save current signal mask*/sigemptyset( &newmask );sigaddset( &newmask, SIGQUIT);if ( sigprocmask( SIG_BLOCK, &newmask, &oldmask) < 0 ){err_sys("SIG_BLOCK error");}sleep(5); /*SIG_QUIT here will remain pending*/if (sigpending( &pendmask) < 0) {err_sys("sigpending error");}if ( sigismember( &pendmask, SIGQUIT) ){err_sys("\nSIGQUIT pending\n");}/*Reset signal mask which unblocks SIGQUIT*/if ( sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0){err_sys("SIG_SETMASK error");}printf("SIGQUIT unblocked\n");sleep(5); /*SIGQUIT here will terminate with core file*/exit(0);}static void sig_quit(int signo){printf("caught SIGQUIT\n");if ( signal(SIGQUIT,SIG_DFL) == SIG_ERR){err_sys("can't reset SIGQUIT");}}

热点排行