在 OSX/Unix 上启动不继承文件/端口的子进程

2024-02-18

我想在 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(使用前将#替换为@)

在 OSX/Unix 上启动不继承文件/端口的子进程 的相关文章

随机推荐