信号集问题

xengine-qyt 2011-09-07 09:23:19
我看到书上说 因为信号编码是从1开始的 而信号集位是0开始的 sigaddset 的第二个参数要-1 但是我看网上哪些又没有,到底要不要减一哦!
...全文
99 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
谭海燕 2011-09-07
  • 打赏
  • 举报
回复
所谓的block和unblock的关系。

block只是推迟信号的发送。但是他还是会发送。只不过是在当信号由block转换成unblock之后该信号才会被发送。

谭海燕 2011-09-07
  • 打赏
  • 举报
回复
kill之后的信号不是在20秒之内收到的。是20秒之后收到的

所谓的block只是推迟了信号的发送。在你恢复了mask之后,信号才被发送。这样,你的处理函数就收到了

信号。
惬意 2011-09-07
  • 打赏
  • 举报
回复
信号编码为0的信号为空信号,这个信号只在一个时候有用途,就是调用kill向某一个进程发送一个空信号可以检查指定的进程是否存在,是否有其他的用途我就不知道了。。。

#include <signal.h>
int sigaddset(sigset_t *set,int signo);//成功返回0,错误返回-1

第二个参数是你想添加的到信号集的信号,不需要减1
xengine-qyt 2011-09-07
  • 打赏
  • 举报
回复


#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

//信号SIGUSR1的处理函数
void sigusr1_handler(int signo)
{
printf("catch SIGUSR1\n"); //输出提示信息,提示接受到SIGUSR1信号
}

int main()
{
sigset_t sigSet; //信号集
//设置信号处理函数
if (SIG_ERR == signal(SIGUSR1,sigusr1_handler))
{
perror("Can't Set Handler For SIGUSR1!\n");
exit(-1);
}
sigemptyset(&sigSet); //清空信号集
sigaddset(&sigSet,SIGUSR1); //设置SIGUSR1
//屏蔽该信号,与原屏蔽字做 或 操作
if (-1 == sigprocmask(SIG_BLOCK,&sigSet,NULL))
{
perror("fail to set signal-mask\n");
exit(-2);
}
printf("SOGISR1 is not available\n");
sleep(20); //休眠,等待用户发送SIGUSR1信号
//恢复屏蔽的信号,与原屏蔽字做“取反”后“与”操作
if (-1 == sigprocmask(SIG_UNBLOCK,&sigSet,NULL))
{
perror("fail to set signal-mask\n");
exit(-3);
}
printf("SIGUSR1 is available now \n");
sleep(20);
return 0;
}




我在另外一个SHELL中使用命令 kill -USR1 PID..命令,无论如何都会调用

printf("catch SIGUSR1\n"); //输出提示信息,提示接受到SIGUSR1信号

请问 问题出在哪儿呢? 没法屏蔽SIGUSR1 信号
谭海燕 2011-09-07
  • 打赏
  • 举报
回复

sigaddset(sigset_t *set, int signo)

第二个参数是你要添加的新号。为什么要-1,这根信号集编码是从几开始有什么关系呢?

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧