【问题标题】:How to add new file descriptors under /dev/fd?如何在 /dev/fd 下添加新的文件描述符?
【发布时间】:2018-07-22 05:06:00
【问题描述】:

我通过 ssh 使用远程 linux 服务器,所以我没有超级用户权限。但是/dev/fd中挂载的文件描述符还不够:

user >ls /dev/fd/
0  1  2 

或:

user >ls /proc/self/fd
0  1  2  

而我想要的是添加新的文件描述符,这样我就可以通过这种方式重定向输出流:

user >./main.exe 1>1.txt 2>2.txt 3>3.txt ...

由于文件描述符不够,无法创建/dev/fd/3之类的文件描述符,触发了错误:

IOError: [Errno 2] No such file or directory: '/dev/fd/3'

【问题讨论】:

  • 另见Use multiple output stream in python? 在您的问题得到真正回答之前,您应该避免接受答案。请不要以不同的方式多次问同一个问题。
  • @jww 实际上,这个问题是我提出来的......当我尝试使用open('/dev/fd/3', 'w')时出现错误
  • @jww 关于在 python 中创建fd 的第一个问题,我猜这更多是关于 linux 的。总之,谢谢提醒
  • /dev/fd 是指向/proc/self/fd 的符号链接,它只是对您的程序已打开的文件句柄的内省。您打开一个文件句柄,您会在该目录中获得一个新条目。因此,shell 中的exec 3>somefile.txt 将创建一个/dev/fd/3,因为它打开了somefile.txt,然后使用dup2() 将自动分配的描述符编号重新编号为3。

标签: linux bash shell io file-descriptor


【解决方案1】:

/dev/fd 不是真正的目录。您无需向其中添加文件,它仅显示进程(在您的情况下为 ls)已打开的 fds。

要从 shell 中打开新的 FD,您只需运行

./yourprogram 3>myfile

如果程序写入 FD 3,则输出将结束于 myfile

这是一个例子:

$ cat foo.c
#include <unistd.h>

void main() {
  write(3, "hello world\n", 12);
}

$ gcc foo.c -o foo

$ ./foo 3> myfile

$ cat myfile
hello world

【讨论】:

  • 嗨,首先,我在编译时遇到错误:error: 'write' was not declared in this scope,那么,是否有办法在 python 中创建文件描述符?我试过open('/dev/fd/3', 'w'),但收到错误IOError: [Errno 2] No such file or directory: '/dev/fd/3'
  • @springcc,任何时候你调用open(),它总是自动分配一个文件描述符。在 Python 中查看文件对象的 fileno 属性 - 无论您的文件对象具有 fileno 的任何编号,都可以通过相同的过程在 /dev/fd 中使用。
  • @springcc, ...如果出于某种奇怪的原因你想在 Python 中分配一个 specific 数字,你可以像 shell 在下面那样做-hood,dup2().
  • @springcc, ...注意上面提到的通过相同的过程——如果你运行./main.exe 3&gt;3.txt,这意味着你的main.exe有一个/dev/fd/3它可以打开;这并不意味着启动main.exe 的shell 看到相同的东西,因为文件描述符是每个进程的。但是,您不应该在没有非常令人信服的理由的情况下使用依赖于 /dev/fd 的非 shell 语言编写软件——它使您的代码仅适用于 Linux,而且通常没有任何目的。
  • 我在编译foo.c 时遇到的唯一问题是警告main() 应该返回int 而不是void。 @springcc 可能错过了#include &lt;unistd.h&gt;
猜你喜欢
  • 2015-01-04
  • 2014-08-25
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2012-01-31
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多