我有以下代码:
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?
好吧,旧的Unix系统最初用于串行终端,一个特殊的程序getty负责管理串行设备,打开和配置它们,在传入的连接上显示消息(中断信号),并将打开的文件描述符传递给登录然后是shell.
它用于打开tty设备作为输入/输出来配置它,然后将其复制到文件描述符0,1和2中.默认情况下,(仍旧旧的)stty命令默认在标准输入上运行.为了确保兼容性,在现代Linux上,当您连接到终端时,文件描述符0仍然为输入/输出打开.
当标准输入连接到终端时,它可以用作快速和脏的黑客只显示提示,因为如果标准输入被重定向到只读文件或管道,则所有写入都将失败(对过程没有任何伤害)和什么都不打印.但它无论如何都是一个肮脏的黑客:想象一下如果调用者传递一个为输入/输出打开的文件作为标准输入会发生什么...这就是为什么好的做法建议使用stderr来提示或消息以避免它们在重定向流中丢失将输出和输入保持在单独的流中,既不是更难也不是更长.
TL/DR:如果连接到终端,即使名称和标准用法表明它是只读的,也会打开输入/输出的标准输入.
| 归档时间: |
|
| 查看次数: |
1283 次 |
| 最近记录: |