Macos 在OSX/Unix上启动一个子进程,该子进程不';t继承文件/端口
我想在OS X上启动一个子进程,这样子进程就不会继承当前进程打开的文件/端口 关于如何做到这一点有什么建议吗?我可以使用system()函数调用的Shell命令也可以工作——我只是不知道有哪一个好的Shell命令可以实现这一点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
谢谢 >你没有指定你正在开发的语言,但是自从你提到了<代码> 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打开应用程序,则会得到不同的环境)。