为什么在主进程中恢复原来的信号屏蔽字后,子进程再发送SIGINT信号后ubuntu直接关机重启!!!

hg2016 2019-04-02 02:44:49
以下是我写的程序,我原本的意图是先将SIGINT信号设为阻塞,然后注册SIGALRM信号的处理函数,每隔1s递归打印一次pending的信号。再创建了一个进程后,子进程负责每隔2s给父进程发送一个SIGINT信号,父进程的意图是等待输入,当输入的字符为‘a’后,就把信号SIGINT屏蔽字解除阻塞,这样SIGALRM信号的处理函数打印出来的就应该是64个0。但结果是每次运行这个程序,输入‘a’并且回车后ubuntu就直接关机重启了。想请教高手原因是什么?谢谢。


#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <signal.h>siget_t set_op;
sigset_t set_pr;
void opSigint()
{
sigaddset(&set_op, SIGINT);
sigprocmask(SIG_BLOCK, &set_op, NULL);
}
void printSig()
{
sigpending(&set_pr);
int i = 1;
for (; i <= _NSIG; i++) {
if (sigismember(&set_pr, i) == 1)
putchar('1');
else
putchar('0');
}
printf("\n");
alarm(2);
}
int main()
{
sigemptyset(&set_op);
sigemptyset(&set_pr);
sigaddset(&set_op, SIGINT);
sigprocmask(SIG_BLOCK, &set_op, NULL);
alarm(1);
signal(SIGALRM, printSig);

pid_t pid = fork();
if(pid == 0){
while(1){
sleep(2);
kill(getppid(),SIGINT);
}
}
else if(pid > 0){
char input;
while(getchar() != 'a'){
;
}
sigset_t set_op2;
sigemptyset(&set_op2);
sigaddset(&set_op2, SIGINT);
sigprocmask(SIG_UNBLOCK, &set_op2, NULL);
}

return 0;
}
...全文
278 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiamianshiye 2019-04-02
  • 打赏
  • 举报
回复

cdp@DESKTOP-3KBDDMU:~/code$ ./a.out 
00000000000000000000000000000000000000000000000000000000000000000
01000000000000000000000000000000000000000000000000000000000000000
01000000000000000000000000000000000000000000000000000000000000000
01000000000000000000000000000000000000000000000000000000000000000
a

cdp@DESKTOP-3KBDDMU:~/code$ 

hg2016 2019-04-02
  • 打赏
  • 举报
回复
你好,能否贴一下你的运行结果图
jiamianshiye 2019-04-02
  • 打赏
  • 举报
回复
我运行你的程序是正常的,Ubuntu14

23,114

社区成员

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

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