我正在实现一个库来运行命令。 这个库是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)?
不,不,
您只需要小心,并在您关心的所有文件描述符上设置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] 举报,一经查实,本站将立刻删除。