gpt4 book ai didi

Ctrl-C 被 getchar() 吃掉

转载 作者:太空狗 更新时间:2023-10-29 15:12:01 25 4
gpt4 key购买 nike

长期以来,我一直在寻找解决我的问题的方法,这就是我求助于您的原因:

考虑这段代码:

static char done = 0;
static void sigHandler(void)
{
done = 1;
}

int user_input()
{
return (getchar() == 'q') ? 0 : 1;
}

int main(void)
{
signal(SIGTERM, sigHandler);
signal(SIGINT, sigHandler);
while (user_input() != 0 && !done)
usleep(1000);
printf("exiting\n");
return 0;
}

预期行为:当用户输入 q 然后回车时程序退出。如果按下 CTRL+C,它会被 sigHandler 函数捕获,将标志“完成”设置为 1 并退出程序。

观察到的行为:CTRL+C 字符被 getchar() 调用吃掉,并且永远不会执行 sigHandler 函数。当按下CTRL+C然后回车时,调用sigHandler函数,程序退出。

有更多经验和知识的人可以帮助我解决这个问题吗?

感谢您的输入:)

最佳答案

有一种方法可以在不诉诸丑陋黑客的情况下中止通话(与 Paul R 所说的相反)。您应该使用 sigaction() 并将 sa_flags 设置为 0 而不是 signal()

此外,signal(2) 手册说:

Avoid its use: use sigaction(2) instead.

#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <errno.h>

static char done = 0;
static void sigHandler(int signum)
{
done = 1;
}

int user_input()
{
return (getchar() == 'q') ? 0 : 1;
}

int main(void)
{
struct sigaction sa;
memset(&sa, 0, sizeof(struct sigaction));
sa.sa_handler = sigHandler;
sa.sa_flags = 0;// not SA_RESTART!;

sigaction(SIGINT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);

while (user_input() != 0 && !done)
usleep(1000);
printf("exiting\n");
return 0;
}

通常,在捕获并处理信号后,大多数(我不确定是否不是全部)系统调用将重新启动。这样,在处理完 sigint 信号后,您的 getchar 函数将继续运行,就好像什么也没发生一样。您可以通过使用 sa_flags=0 调用 sigaction 来更改此行为。

这样,在处理SIGINT后,getchar会返回-1并且errno会被设置为“Interrupted system call”(我不记得常量名称了现在)。

您还必须重写 user_input() 函数以处理返回 -1 的情况。

关于Ctrl-C 被 getchar() 吃掉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7978315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com