我想在OS X上启动子进程,这样子进程就不会继承当前进程的打开文件/端口。
对如何实现这一点有什么建议吗?我可以使用system()函数调用的Shell命令也可以工作--我只是不知道有什么好的shell命令可以实现这一点。
谢谢!
发布于 2009-08-22 04:57:52
经过一些实验,我发现Mac上的'open‘shell命令创建了一个不继承父文件/端口的进程。调用'open foo.app‘作为系统函数的参数可以解决这个问题。当然,这只是mac。对于Unix,这里建议的另一种方法很有意义。
发布于 2009-08-21 00:37:09
您没有详细说明您正在使用哪种语言进行开发,但是既然您提到了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;
}希望这能有所帮助,
埃里克·梅尔斯基
发布于 2009-08-21 02:30:57
在Mac上,您可以使用使用opendir()/readdir()读取目录/dev/fd/来确定打开的文件描述符的集合。有了这些信息,您可以对每个打开的文件描述符调用fcntl(fd, F_SETFD, FD_CLOEXEC),或者在派生之后对每个文件描述符调用close(fd)。
有关其他详细信息,请参阅Getting the highest allocated file descriptor,包括其他系统的方法。
https://stackoverflow.com/questions/1309521
复制相似问题