- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 sigaction 来忽略 ctrl-c。代码最后是为了帮助理解。问题是当我按 ctrl-C 时,^Cctrl-c 出现而不是 ^C,并且它不打印next 立即提示。直到我按下 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
。这意味着当 read()
获得中断时,读取在中断后恢复,这排除了您的主程序打印新提示的机会。
这段代码似乎很可能接近你想要的:
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void sigIntHandler(int signum)
{
fprintf(stderr, "Ctrl-C (%d)\n", signum);
}
int main(void)
{
struct sigaction signalAction;
signalAction.sa_handler = sigIntHandler;
sigemptyset(&signalAction.sa_mask);
signalAction.sa_flags = 0; // SA_RESTART;
sigaction(SIGINT, &signalAction, NULL);
while (1)
{
char block[4096];
printf("sigAction>");
fflush(stdout);
if (fgets(block, 4096, stdin) == 0)
{
if (errno == EINTR)
{
errno = 0;
clearerr(stdin);
fprintf(stderr, "Interrupted!\n");
continue;
}
else
{
fprintf(stderr, "EOF spotted\n");
break;
}
}
if (!strcmp(block, "exit\n"))
{
fprintf(stderr, "Exiting\n");
exit(1);
}
printf("Read: [%.*s]\n", (int)(strlen(block) - 1), block);
}
}
请注意,正式地,您不应该在信号处理程序中使用 printf()
系列函数 — 参见 How to avoid using printf()
in a signal handler?
运行示例(名为 sigact
的程序):
$ ./sigact
sigAction>Ordinary input
Read: [Ordinary input]
sigAction>Some typing, then an interrupt! ^CCtrl-C (2)
Interrupted!
sigAction>More input?
Read: [More input?]
sigAction>Yes, more input.
Read: [Yes, more input.]
sigAction>And why you type control-D?
Read: [And why you type control-D?]
sigAction>EOF spotted
$ ./sigact
sigAction>Also typing exit works, of course.
Read: [Also typing exit works, of course.]
sigAction>exit
Exiting
$
^C
来自终端驱动程序(在 Mac OS X 10.11.6 上)。 lflags
第一行末尾的 echoctl
是这样做的:
$ stty -a
speed 9600 baud; 50 rows; 141 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
-ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^X; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
stop = ^S; susp = ^Z; time = 0; werase = ^W;
$
关于c - 使用 sigaction 实现 ctr-c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38959797/
我在一些代码中看到以下用法: struct sigaction term_handler; // global variable without initialization ... sigacti
我正在做简单的 sigaction 示例来练习 C,但是当我尝试编译代码时,它声称 struct sigaction 不存在 [1]。 当我检查我生成的一些旧代码时,我发现我在文件的最顶部添加了一些
如果我们使用 sigaction 来定义一个信号处理程序,那为什么我们不需要重置处理程序呢?如果我们使用 signal(sig_no,handler_func)那么我们必须重置它。为什么是这样? #i
我正在学习信号并编写了一个简单的程序来处理它们。 所以我输入一个数字,然后使用 fork 创建一个进程。父进程应该将数字作为信号发送给子进程,然后 child_signal 处理程序应该将数字的平方作
我在 C++ 中对此类使用 sigaction 时遇到问题: class SerialHandler{ private: ... /* Action Handling
我有以下 sigaction 处理程序代码 void signal_term_handler(int sig) { int rc = async_lockf(pid_file, F_UNLCK
我正在使用 sigaction 作为信号,我正在为此使用一个简单的结构。我实际上是从手册页中获取的。有人可以向我解释结构中的第二行是做什么的吗?还有一个错误: error: expected decl
有没有办法用sigaction结构和函数只捕获一次信号?更具体地说,我想简单地重置为默认特定信号 (SIGINT)。是否有可能在处理程序中实现这一点? 编辑 所以,这样的事情是正确的: void si
我正在将程序的信号处理从 signal() 转换为 sigaction()。 根据UNIX spec struct sigaction 应该至少有 4 个成员; sa_handler、sa_mask、
我很难理解 sigaction() 的方式有效。 在 , sigaction 定义为 int sigaction(int sig, const struct sigaction *act, struc
我正在查看 sigaction 的手册页,最后我看到了以下行。 sigaction(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
在我下面的代码中,如果我将 old_act 声明为全局变量,那么程序可以正常工作。如果在 main 中声明: 如果使用 SA_RESTART,它工作正常 如果不使用 SA_RESTART,则会导致段错
我必须向进程发送两个信号,SIGUSR1 和 SIGUSR2,以便修改程序中的特定 bool 变量 (SIGUSR1 将其设置为 true,SIGUSR2 将其设置为 false)。所以我写了一个 s
我正要向我们这里的应用程序添加一个额外的信号处理程序,我注意到作者使用了 sigaction() 来设置其他信号处理程序。我打算使用 signal()。按照惯例,我应该使用 sigaction(),但
编译以下代码, struct sigaction sa; memset (&sa, 0, sizeof (sa)); sa.sa_handler = &handler; sigaction (SIGR
我有一个程序,它为 SIGSEGV 安装信号处理程序。在信号处理程序中(我 try catch 崩溃)我重新启动我的应用程序。 但是当我的应用程序复活时,它不再处理 SIGSEGV。 这是一个例子:
我注意到 sigaction 被定义为结构和函数(http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html):
每次收到 SIGINT 时,我都使用 sigaction() 执行操作。我见过的所有教程都使用这个原型(prototype)作为信号处理程序 void sig_handler(int sig); 有没
这个问题在这里已经有了答案: What is it with printf() sending output to buffer? (3 个答案) 关闭 3 年前。 我是 Unix 中信号的新手,这
我正在尝试以下信号处理程序,引用在线教程,但它似乎不起作用,我的代码有什么问题: #include #include #include #include #include typedef void (
我是一名优秀的程序员,十分优秀!