【发布时间】:2011-06-05 23:16:15
【问题描述】:
我正在开发一个 linux C 项目,但在使用文件描述符时遇到了问题。
我有一个具有只写权限的孤立文件描述符(该文件是 open()'d 然后 unlink()'d 但 fd 仍然很好)。原始备份文件具有完全权限(使用 S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH 创建),但可惜文件是使用 O_WRONLY 打开的。是否可以复制文件描述符并将副本更改为O_RDWR?
伪代码:
//open orphan file
int fd = open(fname, O_WRONLY, ...)
unlink(fname)
//fd is still good, but I can't read from it
//...
//I want to be able to read from orphan file
int fd2 = dup(fd)
//----change fd2 to read/write???----
提前致谢! -安德鲁
【问题讨论】:
-
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_RDWR))似乎 就像是这样,除了手册页明确说这不起作用。我想内核“需要”这是不可能的,这是有原因的? -
如果你打算阅读,为什么要以错误模式打开它?
-
奇怪,那
freopen是怎么实现的呢?它只是失败了吗? (允许失败。) -
@R..:在 Linux 下,同样的规则适用。不允许更改访问模式,也不会返回错误(在本例中为 NULL 流)。任何读/写尝试也会导致
EBADF。如果你想要一个不允许它的理由,想象一下将stdin更改为允许写入,将stdout更改为允许读取 - 废话 -
是的,在 Linux 上,您可以通过打开
/proc/self/fd/n来执行此操作。见this stackoverflow answer for source code。