Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在OSX/Unix上启动一个子进程,该子进程不';t继承文件/端口_Macos_Unix_Process - Fatal编程技术网

Macos 在OSX/Unix上启动一个子进程,该子进程不';t继承文件/端口

Macos 在OSX/Unix上启动一个子进程,该子进程不';t继承文件/端口,macos,unix,process,Macos,Unix,Process,我想在OS X上启动一个子进程,这样子进程就不会继承当前进程打开的文件/端口 关于如何做到这一点有什么建议吗?我可以使用system()函数调用的Shell命令也可以工作——我只是不知道有哪一个好的Shell命令可以实现这一点 谢谢 >你没有指定你正在开发的语言,但是自从你提到了 Stand()> />代码,我想你是指C或C++。 通常,这是通过使用fcntl()在不希望继承的文件描述符上设置close on exec标志来实现的: int fd = open("somefile", O_RDO

我想在OS X上启动一个子进程,这样子进程就不会继承当前进程打开的文件/端口

关于如何做到这一点有什么建议吗?我可以使用system()函数调用的Shell命令也可以工作——我只是不知道有哪一个好的Shell命令可以实现这一点


谢谢

>你没有指定你正在开发的语言,但是自从你提到了<代码> Stand()> />代码,我想你是指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;
}
pid_t pid=fork();
开关(pid){
案例0:
//在子进程中。遍历所有可能的文件描述符
//并明确关闭它们。
long maxfd=sysconf(OPEN_MAX);
用于(长i=0;i
希望有帮助


Eric Melski

在Mac OS X上,您可以使用读取目录
/dev/fd/
opendir()
/
readdir()
来确定打开的文件描述符集。有了这些信息,您可以在每个打开的文件描述符上调用
fcntl(
fd
、F_SETFD、fd\u CLOEXEC)
,或者在分叉后在每个文件描述符上调用
close(
fd


有关其他详细信息,请参阅,包括其他系统的方法。

经过一些实验后,我发现Mac上的“open”shell命令创建了一个不继承父文件/端口的进程。调用“open foo.app”作为系统函数的参数就可以实现这一点。当然,这只是mac。对于Unix,这里建议的另一种方法很有意义。

@Eric M:你的回答让我大致了解了这一点,但我发现它仍然保留了一些文件描述符。我用
getdtablesize()
替换了上面代码中的
sysconf(OPEN\u MAX)
,效果非常好。谢谢你的帮助

windows中的CreateProcess具有“bInheritHandles”标志来处理此问题-查找UNIX/Mac OS等效项。open命令告诉launchd生成进程(或在现有进程中打开文档),因此您不是其父进程。这就是它不会从您那里继承任何内容的原因。@mark4o运行
open
会导致结果进程继承环境变量(如果您从终端而不是Finder打开应用程序,则会得到不同的环境)。