微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用open“ / dev / fd / n”,mode重新打开一个现有的文件描述符

如何解决用open“ / dev / fd / n”,mode重新打开一个现有的文件描述符

我正在学习系统编程。

如果我们调用open(“ / dev / fd / n”,mode),我们将复制第n个文件描述符并分配给新的文件描述符。

但是,我们指定的模式必须是所引用文件(/ dev / fd / n)的子集,我想知道这是如何工作的。


这会在打开的文件表中创建一个新条目吗?

  1. 如果是,为什么该模式应该是/ dev / fd / n的文件状态标志的子集?
  2. 如果没有,如何在文件入口表中使用不同的文件状态标志指向两个不同的文件描述符?

解决方法

打开/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);

fdfd2不会共享任何标志/模式,等等。它们是完全分开的。它们也没有任何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);

这四个文件描述符不共享任何内容。但是,它们是到同一文件的四个单独的流。因此,如果我们写入fd2fd3fd4中的任何一个。然后,阅读fd1,我们将看到效果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。