我正在尝试检测Ctrl+D用户输入,我知道它会返回EOF。现在,我知道代码等待来自标准输入流的输入,但是有没有办法让程序继续运行,直到Ctrl+D命令位于标准输入中?如果未输入Ctrl+ ,程序应继续运行到 if 语句之后。D
char buffer[];
if (fgets(buffer, 10, stdin) == NULL{
//write to file
}
Run Code Online (Sandbox Code Playgroud)
小智 5
由于机器EOF在Ctrl+上生成D,因此您应该检查fgets(),NULL因为fgets()有义务NULL在文件末尾返回。
line = fgets(l, BUFFSIZE, stdin)
if (line == NULL)
continue;
Run Code Online (Sandbox Code Playgroud)
Ctrl您想在用户按+D而不实际读取stdin时停止程序吗?在这种情况下,您应该考虑使用Ctrl+C代替。但首先我会写一些关于非阻塞 I/O 的内容,因为这就是您所要求的。
标准C中无法实现非阻塞 I/O 。但是,您可以使用POSIX函数,例如select或fcntl与read. StackOverflow 上还有其他相关问题,应该会提供您需要的所有信息。以这个问题为例。
如果你想处理Ctrl+ C,你可以使用这个signal函数:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
volatile bool shouldRun = true;
void sighandler(int) {
shouldRun = false;
}
int main(int argc, char *argv[]) {
if (signal(SIGINT, &sighandler) == SIG_ERR) {
fprintf(stderr, "Could not set signal handler\n");
return EXIT_FAILURE;
}
printf("Program started\n");
while (shouldRun) {
// Do something...
}
printf("Program is shutting down.\n");
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
请注意,信号处理程序(即sighandler)可能随时中断您的线程。这意味着它们很容易出现竞争状况。您甚至必须避免在信号处理程序中获取任何锁。这意味着仅printf在信号处理程序中调用可能会导致死锁。不过,只需按照示例中所示设置布尔标志就可以了。有一些解决方案(例如信号掩码和自管道技巧)可以规避这些限制,但在这里它们不是必需的。