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");
	}
}

猜你喜欢

转载自yesmeshtu2008-163-com.iteye.com/blog/1449977
今日推荐