OS/X 上的 Control-D 后如何继续从标准输入读取

How to continue reading from stdin after Control-D on OS/X

我想使用 EOF 终止读取批量用户输入,但继续能够接受用户 CLI 输入。

似乎 Linux 允许这种行为,但是 OS/X 只是简单地关闭了标准输入流(从下面的测试程序看来)。

是否有任何解决方法可以在 OS/X 上运行?

运行 在 MAC OS/X 上的示例输出。一旦检测到 EOF,就不能进行任何输入。 (以 >>> 开头的行是程序的输出)。

TDWONG-M-V08D:$ ./eof_stdin
>>> fgets: zzz
>>> ans=zzz

>>> read stdin again, fgets:
zzz
>>> ans=zzz

TDWONG-M-V08D:$ ./eof_stdin
>>> fgets: >>> ans=
>>> feof(stdin) is true -- EOF detected
>>> read stdin again, fgets:
>>> ans=

Linux 上 运行 的示例输出。即使在检测到 EOF 之后也接受输入。 (以 >>> 开头的行是程序的输出)。

[tdwong@tdwong-ubuntu tmp]$ ./eof_stdin
>>> fgets: zzz
>>> ans=zzz

>>> read stdin again, fgets:
zzz
>>> ans=zzz

[tdwong@tdwong-ubuntu tmp]$ ./eof_stdin
>>> fgets: >>> ans=
>>> feof(stdin) is true -- EOF detected
>>> read stdin again, fgets:
zzz
>>> ans=zzz

这里是示例测试程序:

#include<stdio.h>
int main(void)
{
    char ans[80];
    //
    // read from stdin
    printf(">>> fgets: "); fflush(stdin);
    fgets(ans, sizeof(ans), stdin);
        printf(">>> ans=%s\n", ans);
    if (feof(stdin)) {
        printf(">>> feof(stdin) is true -- EOF detected\n");
    }
    //
    // continue read from stdin
    printf(">>> read stdin again, fgets: \n");
    fgets(ans, sizeof(ans), stdin);
        printf(">>> ans=%s\n", ans);
    return 0;
}

检测到 EOF 后,您可以调用标准输入输出函数 clearerr(stdin)clearerr_unlocked(stdin),以清除 stdin 流上的 EOF 状态 - man 3 clearerr 了解更多详情.

HTH