请教一个程序

slmax1 2016-03-01 10:56:34
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

void printsigset(sigset_t *set)
{
int i;
for (i=1; i<NSIG; ++i)
{
if (sigismember(set, i))
putchar('1');
else
putchar('0');
}
printf("\n");
}

void handler(int signo)
{
if (signo == SIGINT)
{
printf("recv a sig=%d\n", signo);
}
else if (signo == SIGQUIT)
{
printf("收到SIGQUIT信号\n");
sigset_t setSig;
sigemptyset(&setSig);
sigprocmask(SIG_SETMASK, &setSig, NULL);
}
}


int main()
{

sigset_t setSig;
sigset_t pSig;

sigemptyset(&setSig);
sigaddset(&setSig, SIGINT);


if (signal(SIGINT, handler) == SIG_ERR)
printf("SIGINT ERR:\n");

if (signal(SIGQUIT, handler) == SIG_ERR)
printf("SIGQUIT ERR:\n");


sigprocmask(SIG_BLOCK, &setSig, NULL);

while (1)
{
sigpending(&pSig);
printsigset(&pSig);
sleep(1);
}
return 0;
}

一开始我按下ctrl+c
打印能显示出 01000000000000000000000000
然后我再按ctrl+\ 打印出 000000000000000000000000000
重点来了.
我再次按ctrl+c 又打印出 01000000000000000000000000

我不是在handler取消了SIGINT信号位的阻塞吗,怎么还会阻塞SIGINT信号位(未决打印01000000000)
...全文
140 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
海阔天空zss 2016-03-04
  • 打赏
  • 举报
回复
今天太晚了,明天我帮你看一下吧
slmax1 2016-03-04
  • 打赏
  • 举报
回复
在别的地址查了一下,似乎是因为解除阻塞信号集函数设置在信号处理函数中导致的. 如果设置在其它地方就没有问题. 希望以后遇到同样问题的可以参考一下. 结贴了.
现在ing 2016-03-03
  • 打赏
  • 举报
回复
引用 2 楼 csshow 的回复:
还是没人吗...来个人接分也可以,.
帮不了你
slmax1 2016-03-03
  • 打赏
  • 举报
回复
还是没人吗...来个人接分也可以,.
slmax1 2016-03-02
  • 打赏
  • 举报
回复
顶一下,难道说这个问题很难?

23,125

社区成员

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

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