【发布时间】:2014-05-05 21:34:25
【问题描述】:
我有以下带有 UNIX 系统调用的测试 C 程序:
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void abide(int sig_num) {
printf("I, sleeper, will abide to this signal %d!\n", sig_num);
fflush(stdout);
exit(0);
}
void refuse(int sig_num) {
signal(SIGINT, refuse);
printf("I, sleeper, REFUSE this signal %d!\n", sig_num);
fflush(stdout);
}
int main(int argc, char *argv[]) {
if (argc > 1 && strcmp(argv[1], "refuse") == 0) {
signal(SIGINT, refuse);
} else if (argc > 1 && strcmp(argv[1], "deaf") == 0) {
printf("I, sleeper, have been made deaf...\n");
} else {
signal(SIGINT, abide);
}
printf("I, sleeper, am now sleeping for 10s...\n");
sleep(10);
printf("I, sleeper, has terminated normally.\n");
return 0;
}
然后我有另一个程序,它充当一个小外壳。在我的测试点,它分叉并让子程序执行上面的程序(使用适当的参数)。这个 shell 也忽略了 Ctrl+C 命令使用
signal(SIGINT, SIG_IGN);
结果如下:
MyShell> ./sleeper
I, sleeper, am now sleeping for 10s...
^CI, sleeper, will abide to this signal!
MyShell> ./sleeper refuse
I, sleeper, am now sleeping for 10s...
^CI, sleeper, REFUSE this signal!
I, sleeper, has terminated normally.
MyShell> ./sleeper deaf
I, sleeper, have been made deaf...
I, sleeper, am now sleeping for 10s...
^C^C^C^C <---- not terminating
第一次运行似乎是正确的。第二个有点奇怪,因为我们实际上忽略了信号,但程序还是终止了。可能是因为我们正在调用sleep(),它被中断了。
但让我感到困惑的是第三个结果。在常规 shell 中,程序终止,但在我的自定义 shell 中没有任何反应。它继续运行。睡眠程序的默认信号处理程序(也终止它)不应该像 abide() 那样执行吗?
感谢您的澄清!
【问题讨论】:
-
第一次运行的输出是预期的?您的
abide函数调用exit(),但您仍然看到main的最后一个printf输出? -
我的错。我把输出复制错了。我编辑了帖子。
-
您似乎刚刚将其编辑掉,这让我认为您向我们展示的不是 真实 控制台输出...
-
我是用肉眼把它复制过来的,所以这就是为什么会出现这个错误。据我所知,其余的都是正确的。