【发布时间】:2016-12-21 22:29:33
【问题描述】:
我正在尝试使用 sigaction 来忽略 ctrl-c。代码在最后帮助理解。问题是当我按 ctrl-C 时,出现 ^Cctrl-c 而不是 ^C,并且不打印下一个提示立即。只有在我点击 Enter 之前,它才会开始打印提示。像这样:
> // run the program sigAction
$./sigAction
sigAction>^Cctrl-C
// it is waiting,waiting . Nothing happens until I hit Enter, next prompt comes up.
sigAction>
我正在寻找的结果是当我按 ctrl-C 而不按 Enter 时,应该立即出现下一个提示。问题如下:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <signal.h>
4 #include <string.h>
5 // implement ignoring ctrl-C
6 void sigIntHandler(int signum) {
7 fprintf(stderr, "ctrl-C\n" );
8
9 }
10
11 main()
12 {
13
14 struct sigaction signalAction;
15 signalAction.sa_handler = sigIntHandler;
16 sigemptyset(&signalAction.sa_mask);
17 signalAction.sa_flags = SA_RESTART;
18 sigaction(SIGINT, &signalAction, NULL);
19 while(1) {
20
21 char block[4096];
22
23 printf("sigAction>");
24 fflush(stdout);
25
26 fgets(block, 4096, stdin);
27
28 if (!strcmp(block, "exit\n")) {
29 exit(1);
30 }
31 }
32 }
当我使用 gdb 查看内部时,它会为我提供以下信息:
(gdb) n
Single stepping until exit from function main,
which has no line number information.
sigAction>^C
Program received signal SIGINT, Interrupt.
0x00007ffff7b15d10 in __read_nocancel () from /lib64/libc.so.6
(gdb) n
Single stepping until exit from function __read_nocancel,
which has no line number information
任何想法都有帮助!提前致谢!
【问题讨论】:
-
为什么是
SA_RESTART?这又回到了中断的系统调用,不是吗?另外,请参阅How to avoid usingprintf()in signal handlers? 此外,您应该至少按照旧 (C99) 标准和最好是新 (C11) 标准进行编码,这两者都需要显式返回类型int main(void)。 -
在信号处理程序中可以安全使用的函数数量非常有限。 fprintf 不是其中之一。
-
非常感谢!