gpt4 book ai didi

c - SIGQUIT 和 STDIN(读取函数的意外转储)

转载 作者:行者123 更新时间:2023-12-04 01:07:17 25 4
gpt4 key购买 nike

我在处理 stdin 和 sigquit 信号时遇到了问题。任务是忽略 sigquit 信号。一切都很好,除了所有“读取”缓冲区都消失了,我不知道如何避免它。这是我的代码:

#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <strings.h>

int main(void)
{
char buffer[4096];
int byte;

bzero(buffer, 4096);
signal(SIGQUIT, SIG_IGN);
while ((byte = read(0, &buffer, 4096)))
{
if (strlen(buffer) == 5 && !strncmp(buffer, "exit", 4))
break ;
write(1, "STDOUT | ", strlen("STDOUT | "));
write(1, buffer, strlen(buffer));
bzero(buffer, 4096);
}
write(1, "Program is finished\n", strlen("Program is finished\n"));
return (0);
}

这是我的输出:

$ ./test
hello world
STDOUT | hello world
hello world^\
STDOUT |
The way it should be
STDOUT | The way it should be
And how it is now^\
STDOUT |
i need help
STDOUT | i need help
really^\
STDOUT |
exit
Program is finished

操作系统:MacOS Mojave - 10.14.6Clang 版本:11.0.1

最佳答案

当您点击 ^C (intr)、^Z (susp) 和 ^\ (quit) 时,您的 tty 层正在刷新您的输入).

解决方案是在运行程序之前调用 stty noflsh

如果您需要以编程方式执行此操作,请参阅此 termios manual page 中的 NOFLSH 标志

关于c - SIGQUIT 和 STDIN(读取函数的意外转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66013702/

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