更改文件描述符的读写权限

13
我正在处理一个Linux C项目,但在使用文件描述符时遇到了麻烦。
我有一个孤立的文件描述符(该文件已经通过open()打开,然后unlink()删除,但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???----


感谢您的提前帮助! - Andrew

5
“fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_RDWR)”似乎是这样做的正确方法,但手册明确说明这不起作用。我猜内核“需要”这个不可能是有原因的吧? - aschepler
2
那么,如果你打算阅读它,为什么要以错误的模式打开它呢? - MK.
2
奇怪,freopen 是如何实现的呢?它只是失败了吗?(允许失败。) - R.. GitHub STOP HELPING ICE
2
@R..:在Linux下,适用同样的规则。不允许更改访问模式,也不会返回错误(在这种情况下为NULL流)。任何读写尝试也会导致EBADF。如果想要不允许它的原因,请想象将stdin更改为允许写入,将stdout更改为允许读取-毫无意义。 - jweyrich
5
在Linux上,您可以打开/proc/self/fd/n来实现此操作。请参考此stackoverflow答案获取源代码 - andrewdotn
显示剩余7条评论
2个回答

6

没有POSIX函数可以更改打开模式。您需要以读/写模式打开它。但由于您正在创建临时文件,我强烈建议您使用mkstemp。该函数以读/写模式正确地打开文件并删除它。最重要的是,它避免了命名和创建文件的竞争条件,从而避免了创建临时文件中的漏洞。


2
mkstemp 不会自动删除文件,据我所知(AFAIK)。 - MK.
MK说的是,我可以在open()函数中添加O_EXCL选项,在失败时重试。 - Andrew Klofas

-1
int fd = open(fname, O_WRONLY, ...)
int fd_ro = open(fname, O_RDONLY, ...)
unlink(fname)
{ write to fd }
close (fd);
read or execute(!) fd_ro

请添加一些细节 - Vinay Prajapati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接