我想在 OS X 上启动一个子进程,以便子进程不会继承当前进程的打开文件/端口。
关于如何实现这一目标有什么建议吗?我可以使用 system() 函数调用的 Shell 命令也可以工作 - 我只是不知道有什么好的 Shell 命令可以实现此功能。
Thanks!
您没有指定您正在开发的语言,但既然您提到了system()
,我假设你指的是 C 或 C++。
通常,这是通过使用 fcntl() 在您不希望继承的文件描述符上设置 close-on-exec 标志来完成的:
int fd = open("somefile", O_RDONLY);
fcntl(fd, F_SETFD, FD_CLOEXEC);
您还可以通过在 fork 之后但在 exec 之前迭代子进程中所有可能的 fd 来以暴力方式完成此操作。这有点棘手,因为它要求您知道最大可能的 fd 值是多少,而且效率也较低,因为您最终将迭代并“关闭”一堆未使用的 fd。像这样的东西:
pid_t pid = fork();
switch (pid) {
case 0:
// In the child process. Iterate through all possible file descriptors
// and explicitly close them.
long maxfd = sysconf(OPEN_MAX);
for (long i = 0; i < maxfd; ++i) {
close(i);
}
// Now exec the new program, file-handle free.
execlp("someprogram", "arg1", "arg2");
break;
case -1:
// TODO: handle errors.
break;
default:
// Parent process.
int status;
pid_t finished = waitpid(pid, &status, 0);
break;
}
希望有帮助,
埃里克·梅尔斯基
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)