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

How to set the O_CLOEXEC when using std::ofstream

本文关键字:设置 CLOEXEC ofstream std      更新时间:2023-10-16

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

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

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

这(很可能)没有可移植的方法。至少有两种选择。

第一个选项,获取fd/附加fd

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

有很多";附加文件描述符"从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

这不太干净(但更有可能起作用)。打开所有不希望孩子继承的fstream。转到/proc/self/fd。对于每个fd,设置FC_CLOEXEC标志。