为什么写()到STDIN工作?

Tom*_*Tom 6 c linux

我有以下代码:

int main()
{
    char str[] = "Hello\n";
    write(0, str, 6);   // write() to STDIN
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我编译并执行这个程序时,"Hello"在终端中打印出来.

为什么它工作,用(STDOUT)write()替换了我的0(STDIN)参数1

Ser*_*sta 7

好吧,旧的Unix系统最初用于串行终端,一个特殊的程序getty负责管理串行设备,打开和配置它们,在传入的连接上显示消息(中断信号),并将打开的文件描述符传递给登录然后是shell.

它用于打开tty设备作为输入/输出来配置它,然后将其复制到文件描述符0,1和2中.默认情况下,(仍旧旧的)stty命令默认在标准输入上运行.为了确保兼容性,在现代Linux上,当您连接到终端时,文件描述符0仍然为输入/输出打开.

当标准输入连接到终端时,它可以用作快速和脏的黑客只显示提示,因为如果标准输入被重定向到只读文件或管道,则所有写入都将失败(对过程没有任何伤害)和什么都不打印.但它无论如何都是一个肮脏的黑客:想象一下如果调用者传递一个为输入/输出打开的文件作为标准输入会发生什么...这就是为什么好的做法建议使用stderr来提示或消息以避免它们在重定向流中丢失将输出和输入保持在单独的流中,既不是更难也不是更长.

TL/DR:如果连接到终端,即使名称和标准用法表明它是只读的,也会打开输入/输出的标准输入.

  • 是的。只是大多数人似乎对我的示例代码感到惊讶,其中“fprintf(stderr, ...)”分散在各处,为用户输出人类可读的信息(而不是用于 *data* 的 stdin/stdout)。我希望更多的人建议学习者使用 stderr 进行人类可读的诊断,使用 stdin/stdout 主要用于数据。学习者常常认为“黑客很酷”,并且常常不会抓住更好的实践。你很酷,所以你可以树立一个更好的榜样。;) (2认同)

mpo*_*llo 5

因为默认情况下,终端会将stdin回显给控制台.尝试将其重定向到文件; 它实际上并没有写入stdout.