为什么写()到STDIN工作?

时间:2016-06-14 21:40:05

标签: c linux

我有以下代码:

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

编译并执行此程序时,终端中已打印"Hello"

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

3 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:0)

你是否混淆写与fwrite? write中的第一个参数是"文件描述符",但它不是标准输入。尝试对stdin做一个fwrite - 它没有发生。