如何在使用std::ofstream时设置O_CLOEXEC

5

什么是c++ (std::ofstream) 的等效物:

int fd = open(fn,O_WRONLY|O_NDELAY|O_APPEND|O_CREAT|O_CLOEXEC,0600);

我想要使用这个应用程序,它只能在较新的Linux版本上运行,因此可移植性不是问题。

1个回答

2

很可能没有可移植的方法来实现这一点。至少有两个选项。

第一种选择,获取fd /附加fd

  • 获取ofstream的文件描述符
  • 将文件描述符附加到ofstream上

有许多“附加文件描述符”,“从fstream获取文件描述符”等示例。如果您能找到一个有效的示例,那么就可以完成所有设置。

如果您可以执行第一个操作,则可以在该文件上执行 fcntl 操作。

/* not checking return values since I am lazy; *you* should check them */
flags = fcntl(fd, F_GETFD);
flags |= FD_CLOEXEC;
fcntl(fd, F_SETFD, flags)

如果你能做到第二个选项,你可以通过open获取你的描述符并将其附加。

第二个选项,获取所有打开的fds并在它们上设置FD_CLOEXEC

这种方法不太干净(但更有可能起作用)。打开所有你不想让子进程继承的fstreams。前往/proc/self/fd。对于每个fd,设置FC_CLOEXEC标志。


2
提到的方法不是线程安全的(或者信号安全的)。FD_CLOEXEC 可以直接添加到 open(2) 的整个原因是为了避免竞争。如果在打开文件和调用 fcntl 之间调用 fork(),那么文件将不会被关闭。 - Carlo Wood

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