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

psy*_*tik 3 unix macos process

我想在OS X上启动子进程,以便子进程不继承当前进程的打开文件/端口.

有关如何实现这一目标的任何建议?我可以使用system()函数调用的Shell命令也可以工作 - 我只是不知道有一个好的shell命令来启用它.

谢谢!

Eri*_*ski 11

您没有指定您正在开发的语言,但自从您提到以来system(),我认为您的意思是C或C++.

通常,这是通过使用fcntl()在您不希望继承的那些文件描述符上设置close-on-exec标志来实现的:

int fd = open("somefile", O_RDONLY);
fcntl(fd, F_SETFD, FD_CLOEXEC);
Run Code Online (Sandbox Code Playgroud)

您也可以通过在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;
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助,

埃里克·梅尔斯基