sigemptyset、sigaddset、sigprocmask的用法

程序可以实现!!!!!!!
http://hi.baidu.com/mylife1898/blog/item/09439ef9491f7c51252df2ee.html/cmtid/a5b6e851d8d265868c543006

源程序:

#include <signal.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
double y;
sigset_t intmask;
int i,repeat_factor;
if(argc!=2)
{
fprintf(stderr,"Usage:%s repeat_factor\n\a",argv[0]);
exit(1);
}
if((repeat_factor=atoi(argv[1]))<1)repeat_factor=10;
sigemptyset(&intmask); /* 将信号集合设置为空 */
sigaddset(&intmask,SIGINT); /* 加入中断 Ctrl+C 信号*/
while(1)
{
/*阻塞信号,我们不希望保存原来的集合所以参数为NULL*/
sigprocmask(SIG_BLOCK,&intmask,NULL);
fprintf(stderr,"SIGINT signal blocked\n");
for(i=0;i<repeat_factor;i++)y=sin((double)i);
fprintf(stderr,"Blocked calculation is finished\n");
/* 取消阻塞 */
sigprocmask(SIG_UNBLOCK,&intmask,NULL);
fprintf(stderr,"SIGINT signal unblocked\n");
for(i=0;i<repeat_factor;i++)y=sin((double)i);
fprintf(stderr,"Unblocked calculation is finished\n");
}
exit(0);
}

解释如下:

sigemptyset 函数初始化信号集合set,将set 设置为空.

sigfillset 也初始化信号集合,只是将信号集合设置为所有信号的集合.

sigaddset 将信号signo 加入到信号集合之中,sigdelset 将信号从信号集合中删除.

sigismember 查询信号是否在信号集合之中.s

igprocmask 是最为关键的一个函数.在使用之前要先设置好信号集合set.这个函数的作用是将指定的信号集合set 加入到进程的信号阻塞集合之中去,如果提供了oset 那么当前的进程信号阻塞集合将会保存在oset 里面.参数how 决定函数的操作方式:
SIG_BLOCK:增加一个信号集合到当前进程的阻塞集合之中.
SIG_UNBLOCK:从当前的阻塞集合之中删除一个信号集合.
SIG_SETMASK:将当前的信号集合设置为信号阻塞集合.

上述源程序,在不带参数执行时,输出是个错误的结果是:Usage:./sigset repeat_factor

带参数执行后的结果将是不断重复如下语言:

SIGINT signal blocked
Blocked calculation is finished
SIGINT signal unblocked
Unblocked calculation is finished
SIGINT signal blocked
Blocked calculation is finished
SIGINT signal unblocked
Unblocked calculation is finished
SIGINT signal blocked
Blocked calculation is finished
SIGINT signal unblocked
Unblocked calculation is finished
SIGINT signal blocked
Blocked calculation is finished
SIGINT signal unblocked
Unblocked calculation is finished
SIGINT signal blocked
Blocked calculation is finished
SIGINT signal unblocked
Unblocked calculation is finished

在输入Ctrl+c后将会停止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`sigprocmask` 函数是一个系统调用,用于设置进程的信号屏蔽字,用于控制信号的传递。该函数有三个参数:`how` 表示如何修改信号屏蔽字,`set` 表示新的信号屏蔽字,`oldset` 表示旧的信号屏蔽字。 `how` 参数可以取以下三个值: - `SIG_BLOCK`:将 `set` 中的信号添加到当前进程的信号屏蔽字中。 - `SIG_UNBLOCK`:将 `set` 中的信号从当前进程的信号屏蔽字中移除。 - `SIG_SETMASK`:将当前进程的信号屏蔽字替换为 `set` 中的信号屏蔽字。 `set` 参数是一个指向 `sigset_t` 类型的指针,表示新的信号屏蔽字。`sigset_t` 是一个用于存储信号集合的类型,可以使用 `sigemptyset`、`sigfillset`、`sigaddset`、`sigdelset` 等函数来进行初始化和操作。 `oldset` 参数是一个指向 `sigset_t` 类型的指针,表示旧的信号屏蔽字。如果该参数不为 `NULL`,则 `sigprocmask` 函数会将当前进程的信号屏蔽字存储到 `oldset` 指向的内存中。 以下是一个示例代码,演示了如何使用 `sigprocmask` 函数设置信号屏蔽字: ```c #include <stdio.h> #include <signal.h> int main() { sigset_t set, oldset; sigemptyset(&set); sigaddset(&set, SIGINT); sigprocmask(SIG_BLOCK, &set, &oldset); printf("signal mask has been set to block SIGINT\n"); // do something sigprocmask(SIG_SETMASK, &oldset, NULL); printf("signal mask has been restored\n"); return 0; } ``` 在上面的示例中,我们首先使用 `sigemptyset` 和 `sigaddset` 函数初始化 `set`,将 `SIGINT` 信号添加到信号集合中。然后使用 `sigprocmask` 函数将 `SIGINT` 信号添加到当前进程的信号屏蔽字中,从而屏蔽该信号。在处理完需要屏蔽信号的任务后,我们使用 `sigprocmask` 函数将信号屏蔽字恢复为原始状态。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值