您的位置:首页 > 产品设计 > UI/UE

UNIX环境高级编程学习之第十章信号-信号集的操作,让进程阻塞SIGQUIT信号

2010-03-01 11:10 621 查看
UNIX环境高级编程学习之第十章信号-信号集的操作,让进程阻塞SIGQUIT信号

/*
File: sigprocmask.c
Desc: 信号集的操作,让进程阻塞SIGQUIT信号
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
// 出错处理函数
void err_sys(char * msg)
{
printf("Error: %s /n", msg);
exit(-1);
}
//退出信号处理函数
static void sig_quit(int signo)
{
printf("Info: caught SIGQUIT (捕获SIGQUIT信号)/n");
if (signal(SIGQUIT, SIG_DFL) == SIG_ERR)
{
err_sys("can't reset SIGQUIT (恢复SIGQUIT系统默认处理出错)");
}
}
int main()
{
sigset_t newmask, oldmask, pendmask;
if (signal(SIGQUIT, sig_quit) == SIG_ERR)
{
err_sys("can't catch SIGQUIT(不能捕捉SIGQUIT信号)");
}
/* 阻塞SIGQUIT和保存当前信号屏蔽字 */
sigemptyset(&newmask);  // 清空信号集
sigaddset(&newmask, SIGQUIT); // 添加一个信号
if ( sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) // 设置阻塞信号集newmask, 保存阻塞这前信号集oldmask
{
err_sys("SIG_BLOCK error(设置阻塞信号集出错)");
}
sleep(5); // 按Ctrl+/
if (sigpending(&pendmask) < 0) // 取出当前未决信号集 (当前阻塞信号)
{
err_sys("sigpending error");
}
if (sigismember(&pendmask, SIGQUIT)) // 判断当前阻塞信号集中有没有SIGQUIT
{
printf("SIGQUIT pending (SIGQUIT 是没有处理) /n");
}
if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)  // 设置阻塞为原来的信号集
{
err_sys("SIG_SETMASK error(设置阻塞信号集出错)");
}
sleep(5);// 按Ctrl+/
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐