在 C 中检测 Ctrl-D

1 c stdin fgets exit ctrl

我正在尝试检测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

由于机器EOFCtrl+上生成D,因此您应该检查fgets()NULL因为fgets()有义务NULL在文件末尾返回。

line = fgets(l, BUFFSIZE, stdin)
if (line == NULL)
    continue;
Run Code Online (Sandbox Code Playgroud)


Joj*_*GME 5

Ctrl您想在用户按+D而不实际读取stdin时停止程序吗?在这种情况下,您应该考虑使用Ctrl+C代替。但首先我会写一些关于非阻塞 I/O 的内容,因为这就是您所要求的。


标准C中无法实现非阻塞 I/O 。但是,您可以使用POSIX函数,例如selectfcntlread. 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在信号处理程序中调用可能会导致死锁。不过,只需按照示例中所示设置布尔标志就可以了。有一些解决方案(例如信号掩码自管道技巧)可以规避这些限制,但在这里它们不是必需的。