如何在默认情况下设置close-on-exec

我正在实现一个库来运行命令。 这个库是C,在Linux上。

它目前做一个popen()调用来运行一个命令并获得输出。 问题是该命令inheritance所有当前打开的文件处理程序。

如果我做了fork / exec,我可以明确地closuressubprocess中的处理程序。 但是那意味着重新实现popen()。

我可以在所有处理程序上设置close-on-exec,而不必逐个循环遍历它们吗?

我可以将过程中的close-on-exec设置为默认值吗?

谢谢!

Solutions Collecting From Web of "如何在默认情况下设置close-on-exec"

不,不,

您只需要小心,并在您关心的所有文件描述符上设置close-on-exec。

虽然设置它很容易:

#include <fcntl.h> fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); #include <unistd.h> /* please don't do this */ for (i = getdtablesize(); i --> 3;) { if ((flags = fcntl(i, F_GETFD)) != -1) fcntl(fd, F_SETFD, flags | FD_CLOEXEC); } 

如果你正在运行Linux内核≥2.6.23和glibc≥2.7, open (和其他类似的系统调用一样)接受一个新的标志O_CLOEXEC

 #include <unistd.h> fd = open("...", ... | O_CLOEXEC); 

如果你正在运行Linux内核≥2.6.24和glibc≥2.7, fcntl接受一个新的参数F_DUPFD_CLOEXEC

 #include <fcntl.h> newfd = fcntl(oldfd, F_DUPFD_CLOEXEC); 

如果你正在运行Linux内核≥2.6.27和glibc≥2.9,那么有新的系统调用pipe2dup3等等,而更多的系统调用获得新的*_CLOEXEC标志:

 #define _GNU_SOURCE #include <unistd.h> pipe2(pipefds, O_CLOEXEC); dup3(oldfd, newfd, O_CLOEXEC); 

请注意, POSIX 指定

popen()函数应确保在父进程中保持打开状态的以前的popen()调用的任何流在新的子进程中关闭。

所以如果你担心泄漏,不要这样做。

还有一个老问题,但是如何在fork()之后的孩子中使用getpid() ,然后查看/proc/PID/fd/目录,并关闭所有在那里找到的描述符(除了0,1,2和你得到的opendir() ),然后execve()