【问题标题】:Change read/write permissions on a file descriptor更改文件描述符的读/写权限
【发布时间】: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

标签: c linux unlink dup


【解决方案1】:

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

【讨论】:

  • mkstemp 没有取消链接 AFAIK?
  • MK 所说的。我总是可以将 O_EXCL 添加到 open() 并在失败时重试
【解决方案2】:
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

【讨论】:

  • 请补充一些细节
猜你喜欢
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
相关资源
最近更新 更多