在C中检测Ctrl-D

时间:2016-03-06 06:24:17

标签: c stdin exit fgets ctrl

我正在尝试检测 Ctrl + D 用户输入,我知道它返回EOF。现在,我知道代码等待来自stdin流的输入,但有没有办法让程序继续,直到 Ctrl + D 命令在stdin中?如果未输入 Ctrl + D ,程序应继续运行if语句。

char buffer[];
if (fgets(buffer, 10, stdin) == NULL{
    //write to file
}

4 个答案:

答案 0 :(得分:3)

当用户按 Ctrl + D 时,您想要停止程序吗?但是你不想阅读 stdin ?如果这是真的,您应该考虑 Ctrl + C 的处理程序是否是更好的解决方案。但首先我会写一些关于非阻塞I / O的内容,因为这是你要求的。

C 中没有标准的方法来实现非阻塞I / O.但是您可以将{em> POSIX - 函数(例如selectfcntlread结合使用)。 StackOverflow上还有其他一些问题。例如This question

如果你想处理 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;
}

答案 1 :(得分:2)

由于机器在 Ctrl + D 上生成EOF,您应该fgets()检查NULL,{{{ 1}}必须在文件末尾返回fgets()

NULL

答案 2 :(得分:0)

在这里发帖太多了,你并不具体说明你现在和你想要什么。所以这里给出了如何做到这一点的一般概念:

  1. 将if语句放在分叉进程或其他线程中
  2. 在捕获密钥时向您的(父)进程发送posix信号
  3. 在程序中添加信号处理程序

    如果您只想在输入C-d时终止程序,只需在步骤2中发送SIGKILL并忽略第3步。

  4. 如果您不知道上述任何条款,Google就是您的朋友

答案 3 :(得分:0)

在大多数操作系统上,stdin一次缓冲一行,并且任何读取它的尝试(不会进入低级别的恶意)将停止,直到行或EOF可用。如果您不介意这一点,并且只想在不读取任何等待输入的情况下检查EOF,如果EOF不存在,您可以使用ungetc:

search = input("Enter keyword(s) here:")

你只能保证来自ungetc的一个回退角色,尽管大多数实现都会给你更多。只有当你以后不去寻找流时(stdin的情况就是这样)它才有效。另请注意,我正在调用它&#34;字节键入&#34;,而不是&#34;字符类型&#34 ;:例如,中文,日文和韩文字符不适合大多数C实现的char类型,并且它取决于控制台在您键入时如何对它们进行编码(如果您设置了CJK输入法或者可以复制/粘贴一些,您可以在上面的程序中尝试并查看)。