如何解决用open“ / dev / fd / n”,mode重新打开一个现有的文件描述符
我正在学习系统编程。
如果我们调用open(“ / dev / fd / n”,mode),我们将复制第n个文件描述符并分配给新的文件描述符。
但是,我们指定的模式必须是所引用文件(/ dev / fd / n)的子集,我想知道这是如何工作的。
解决方法
打开/dev/fd/n
时,我们不是在 “复制”文件描述符。我们正在打开一个全新的文件。
使用dup
可能会使您感到困惑。因为我们知道n
的二进制值,所以我们可以这样做:int fdn = dup(n);
。 将共享事物。
但是,这不是我们正在做的事情。
/dev/fd
是指向/proc/self/fd
的符号链接。如果我们执行ls -l /proc/self/fd > /tmp/out
,我们将得到类似的信息:
total 0
lrwx------. 1 cae cae 64 Nov 7 00:16 0 -> /dev/pts/2
l-wx------. 1 cae cae 64 Nov 7 00:16 1 -> /tmp/out
lrwx------. 1 cae cae 64 Nov 7 00:16 2 -> /dev/pts/2
lr-x------. 1 cae cae 64 Nov 7 00:16 3 -> /proc/35153/fd
如果我们这样做:
fd = open("/proc/self/0",O_WRONLY);
这与相同相同:
fd2 = open("/dev/pts/2",O_WRONLY);
fd
和fd2
不会共享任何标志/模式,等等。它们是完全分开的。它们也没有任何fd为0的通用标志/模式。
请注意,我特意指定了/proc/self/0
[开放供阅读],但是我们还是为写作打开了它。
不不在乎[也不使用]原始描述符标志,等等。再次,它只是“双层” symlink 的完整路径最终的 target 文件:/dev/pts/2
目标文件的 file 权限决定了是否允许给定的open
(例如,如果权限为0444,我们尝试使用O_WRONLY
打开,则将返回EPERM
)。
这与我们拥有一个看起来像这样的目录没什么不同
total 0
-rw-r--r--. 1 cae cae 0 Nov 7 00:29 a
lrwxrwxrwx. 1 cae cae 1 Nov 7 00:29 b -> a
lrwxrwxrwx. 1 cae cae 1 Nov 7 00:29 c -> a
lrwxrwxrwx. 1 cae cae 1 Nov 7 00:29 d -> c
我们可以做到:
int fd1 = open("a",O_RDONLY);
int fd2 = open("b",O_WRONLY);
int fd3 = open("c",O_WRONLY);
int fd4 = open("d",O_WRONLY);
这四个文件描述符不共享任何内容。但是,它们是到同一文件的四个单独的流。因此,如果我们写入fd2
,fd3
或fd4
中的任何一个。然后,阅读fd1
,我们将看到效果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。