Bug shell sigset_t

时间:2018-04-09 22:44:18

标签: c shell signals

sigset_t new,old;


sigemptyset(&new);
sigaddset(&new, SIGINT); 
sigaddset(&new, SIGTSTP);
sigprocmask(SIG_BLOCK, &new, &old);
//Before son

(exec,(other stuff...))

// ON Father
sigprocmask(SIG_UNBLOCK, &new, &old);
sigprocmask(SIG_SETMASK, &old, NULL); 

我正在做一个项目,就是这个,一个shell程序。我已经完成了项目的第一部分,即使用管道,forks,exec,I / O文件。现在我正在崩溃我的项目以找到错误,我来到这个对我来说非常烦人,因为我找不到解决方案。抱歉,我无法在此发布所有代码,因为它可能会被我的同学复制。

查看上面的代码,如果我执行我的程序并发送垃圾邮件CTRL Z和CTRL C,就在执行开始时没有插入任何命令,我的处理程序将进入操作,说该程序无法暂停或暂停,如果我写了一个新的命令,“睡5”,再次发送垃圾邮件,由于sigset_t,它处于“忽略”状态,在命令完成后它会给我处理程序的消息,因为“睡眠5” “暂停所有内容,并等待我插入一个新命令,如果我再次发送垃圾邮件,我的处理程序不应该发出任何消息。就像我添加的信号仍然被阻止。 SIG_UNBLOCK是否解锁了我添加的整个信号集或只是一个?

1 个答案:

答案 0 :(得分:0)

@Stargateur找到了问题的根源。

正确的代码是:

sigset_t new,old;


sigemptyset(&new);
sigaddset(&new, SIGINT); 
sigaddset(&new, SIGTSTP);
sigprocmask(SIG_BLOCK, &new, &old);
//Before son

(exec,(other stuff...))

// ON Father
sigprocmask(SIG_UNBLOCK, &new, &old);