首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在OSX/Unix上启动一个不继承文件/端口的子进程

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

Stack Overflow用户
提问于 2009-08-21 00:25:05
回答 4查看 2.6K关注 0票数 3

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

对如何实现这一点有什么建议吗?我可以使用system()函数调用的Shell命令也可以工作--我只是不知道有什么好的shell命令可以实现这一点。

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-22 04:57:52

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

票数 0
EN

Stack Overflow用户

发布于 2009-08-21 00:37:09

您没有详细说明您正在使用哪种语言进行开发,但是既然您提到了system(),我想您指的是C或C++。

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

代码语言:javascript
运行
复制
int fd = open("somefile", O_RDONLY);
fcntl(fd, F_SETFD, FD_CLOEXEC);

你也可以在fork之后但在exec之前,通过对子进程中所有可能的fd进行迭代,以蛮力的方式来实现。这有点棘手,因为它要求你知道最大可能的fd值是多少,而且效率也较低,因为你最终会迭代并“关闭”一堆未使用的fd。

代码语言:javascript
运行
复制
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;
}

希望这能有所帮助,

埃里克·梅尔斯基

票数 11
EN

Stack Overflow用户

发布于 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,包括其他系统的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1309521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档