【发布时间】:2016-02-10 08:37:37
【问题描述】:
我有一个使用 forkpty 执行 bash shell 的 C 程序。我发现这个 shell 启动的程序是在忽略 SIGINT 的情况下启动的,所以当我向 shell 发送 Ctrl-C 时,它们永远不会关闭。
示例:
int masterFd;
char* args[] = {"/bin/bash", "-i", NULL };
int procId = forkpty(&masterFd, NULL, NULL, NULL);
if( procId == 0 ){
execve( args[0], args, NULL);
}
else {
// Simple code that reads from standard in and writes to masterFd.
// I also register for Ctrl-C and write it to masterFd if caught
}
其他控制字符似乎可以通过,ctrl-D,ctrl-?等等。但是,每当我查看由新的 bash shell 启动的进程的状态时,它看起来好像 SIGINT 被屏蔽了。
MyShell:# sleep 1000
StandardTerm:# ps -ef | grep sleep
root 26611 19278 0 17:44 pts/1 00:00:00 sleep 1000
root 26613 32376 0 17:44 pts/1 00:00:00 grep sleep
StandardTerm:# grep Sig proc/26611/status
SigQ: 0/256428
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000010006 <- THE 6 IS THE PROBLEM
SigCgt: 0000000180000000
SigIgn 设置了 2 位,这意味着 2 (SIGINT) 被忽略。如果我做同样的事情,但在标准终端中运行 sleep (或 cat 一个巨大的文件或其他什么),这个位被清除。当我启动我的 pty bash 导致它创建忽略 SIGINT 的孙子程序时,我在做什么?
此外,如果我向进程发送 SIGINT 信号
StandardTerm:# kill -2 26611
什么都没有发生。奇怪的是,当我向我 forkpty'ed IT 工作的 bash shell 发送相同的命令时,因为那个 bash shell 没有忽略 SIGINT。
提前致谢!
【问题讨论】: