没有文件描述符(FD)号是特殊的。FD 0上的stdin,FD 1上的stdout和FD 2上的stderr只是一个约定。
登录时,关联的终端设备将“连接”到这些FD。运行命令时,除非您指示Shell进行重定向,否则它会继承描述符。但是,一旦该程序启动后,可以
close,
dup或者
open文件描述符,只要你喜欢。
回到您的问题:
stdout = open(0, "w")stdout.write("Hello World") # Prints Hello Worldstdout.close()
尽管有名称,
open在这种情况下不会打开任何内容。它从一个已经打开的低级FD创建一个Python文件对象(带有缓冲区和所有高级内容),它实际上只是一个数字(内核中打开文件表的索引)。它有一个单独的函数:os.fdopen
更有趣的一点是,没有标准的方法可以将打开模式从读取更改为写入,而您的程序将写入标准输入。答案是(至少在Linux上)这根本没有发生。如您所见
lsof,所有3个标准FD都通常以读/写模式打开(以标记结尾
u),例如:
cmd 32154用户0u CHR 136,7 0t0 10 / dev / pts / 7cmd 32154用户1u CHR 136,7 0t0 10 / dev / pts / 7cmd 32154用户2u CHR 136,7 0t0 10 / dev / pts / 7
因此,您的程序只需写入连接到终端的FD 0。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)