当前位置: 首页 > 面试题库 >

open()中的整数文件描述符“ 0”

焦宏硕
2023-03-14
问题内容

在Python
3中,可以使用以下格式的“整数文件描述符”打开文件对象:

stdout = open(1, "w")
stdout.write("Hello World") # Prints Hello World
stdout.close()

虽然,有趣的是,我发现这0也是有效的流。

如果我把它放在文件中testio.py

stdout = open(0, "w")
stdout.write("Foo Bar\n")
stdout.close()

然后运行该代码,输出为:

bash-3.2$ python3 testio.py
Foo Bar

看起来就像stdout。然而…

bash-3.2$ python3 testio.py > testio.txt
Foo Bar
bash-3.2$ cat testio.txt

因此看来这实际上不是stdout,而是其他。它似乎也不stderr是:

bash-3.2$ python3 testio.py 2> testio.txt
Foo Bar
bash-3.2$ cat testio.txt

但是,我确实发现可以使用0>以下命令重定向输出:

bash-3.2$ python3 testio.py 0> testio.txt
bash-3.2$ cat testio.txt
Foo Bar

所以我的问题是,到底该怎么open(0, "w")办?重定向的“ 0>”流是什么?

Python 3.6.5
Bash 3.2


问题答案:

没有文件描述符(FD)号是特殊的。FD 0上的stdin,FD 1上的stdout和FD 2上的stderr只是一个约定。

登录时,关联的终端设备将“连接”到这些FD。运行命令时,除非您指示Shell进行重定向,否则它会继承描述符。但是,一旦该程序启动后,可以closedup或者open文件描述符,只要你喜欢。

回到您的问题:

stdout = open(0, "w")
stdout.write("Hello World") # Prints Hello World
stdout.close()

尽管有名称,open在这种情况下不会打开任何内容。它从一个已经打开的低级FD创建一个Python文件对象(带有缓冲区和所有高级内容),它实际上只是一个数字(内核中打开文件表的索引)。它有一个单独的函数:os.fdopen

更有趣的一点是,没有标准的方法可以将打开模式从读取更改为写入,而您的程序将写入标准输入。答案是(至少在Linux上)这根本没有发生。如您所见lsof,所有3个标准FD都通常以读/写模式打开(以标记结尾u),例如:

cmd 32154用户0u CHR 136,7 0t0 10 / dev / pts / 7
cmd 32154用户1u CHR 136,7 0t0 10 / dev / pts / 7
cmd 32154用户2u CHR 136,7 0t0 10 / dev / pts / 7

因此,您的程序只需写入连接到终端的FD 0。



 类似资料:
  • 文件描述符 Linux很重要的设计思想就是一切皆文件,网络是文件,键盘等外设也是文件,很神奇吧?于是所有资源都有了统一的接口,开发者可以像写文件那样通过网络传输数据,我们也可以通过/proc/的文件看到进程的资源使用情况。 内核给每个访问的文件分配了文件描述符(File Descriptor),它本质是一个非负整数,在打开或新建文件时返回,以后读写文件都要通过这个文件描述符了。 应用 我们想想操作

  • 文件描述符接口 函数 int  fd_new (void)   分配文件描述符   struct dfs_fd *  fd_get (int fd)   获取文件描述结构   void  fd_put (struct dfs_fd *fd)   放置文件描述符   int  fd_is_open (const char *pathname)   判断文件是否已被打开   int  select (

  • 问题内容: 有没有办法在原始文件描述符而不是FILE *上执行ftell()的操作(返回文件中的当前位置)?我认为应该有,因为您可以使用lseek()查找原始文件描述符。 我知道我可以使用fdopen()创建与文件描述符相对应的FILE *,但我宁愿不这样做。 问题答案: 只需使用:

  • 当使用了大量虚拟主机,而且每个主机又使用了不同的日志文件时,Apache可能会遭遇文件描述符(有时也称为文件句柄)耗尽的困境。Apache使用的文件描述符总数如下:每个不同的错误日志文件一个、每个其他日志文件指令一个、再加10-20个作为内部使用。Unix操作系统限制了每个进程可以使用的文件描述符数量。典型上限是64个,但可以进行扩充,直至到达一个很大的硬件限制为止(hard-limit)。 尽管

  • 处理文件描述符 尽管很不像,但是在大多操作系统中,标准输入输出流 stdin 和 stdout 虽然叫做「流」,但它们都有文件的接口。我们同样也会将它们实现成为文件。 但是不用担心,作为文件的许多功能,stdin 和 stdout 都不会支持。我们只需要为其实现最简单的读写接口。 进程打开的文件 操作系统需要为进程维护一个进程打开的文件清单。其中,一定存在的是 stdin stdout 和 std

  • 问题内容: 我正在使用globus工具包进行项目。在我的服务中,我有一个资源:一个字符串数组。我想从Android客户端获取此资源。我怎样才能做到这一点?如何在wsdl文件中描述“字符串数组”类型?谢谢。 问题答案: 我猜你在找这个 资料来源:http : //www.activebpel.org/samples/samples-2/BPEL_Samples/Resources/Docs/arra