微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

如何将string的string转换为字符?

我怎样才能确定一个pid_t的最大值?

套接字很less返回-1(errno 97)

在chmod上使用fchmod比较好吗?

SendMessage(hwnd,registeredmssghere,0,1)收到但没有正确识别它的发送到钩的线程!

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

谢谢!

发送json数据到远程服务器进行身份validation

EnumDesktopWindows错误:(183)当该文件已经存在时,无法创build文件

内部捕获/redirect标准输出

如何在SaveFileDialog的认FileName中设置长string(> 260)?

在Linux机器上获取用户认电子邮件

不,不,

您只需要小心,并在您关心的所有文件描述符上设置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,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,那么有新的系统调用pipe2 , dup3等等,而更多的系统调用获得新的*_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() ?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐