1.这段代码发生了什么:
close(0)
现在,有没有办法读取输入?
2.这个怎么办:
close(0)
dup(1)
我认为现在输入来自标准输出,但这是什么意思?
这意味着您现在在文件描述符 0 上打开了标准输出。您是否可以从该文件描述符中读取取决于您的标准输出实际上是什么。如果您的标准输出是具有输入和输出功能的终端(或伪终端),那么您可能能够读取它。如果您的标准输出是启动程序的 shell 以只写模式打开的文件,那么您可能无法读取它。
在任何情况下,您都不应依赖任何特定行为;执行此操作后,您不应期望能够从文件描述符 0 中读取。
似乎没有办法读取输入。但是,如果您碰巧预见到这种情况,您可以“保存”stdin
描述符,如下所示:
int stdin_save;
...
stdin_save = dup(0);
...
close(0); // Here it is "impossible" to read input
...
dup(stdin_save); // Possible to read input again!
正如Eric Postpischil所解释的,如果您stdout
以读写方式连接到文件/设备(如终端的典型情况),则在执行之后dup(1)
,将恢复正常的读取功能。但是没有什么不寻常的事情发生(比如程序自言自语)。