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

时间:2011-06-21 08:53:58

标签: c++ linux

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

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

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

1 个答案:

答案 0 :(得分:2)

(可能)没有可移植的方法来做到这一点。至少有两种选择。

第一个选项,获取fd / attach 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

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