加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 01:51:05 所属栏目:安全 来源:网络整理
导读:我想在OS X上启动子进程,以便子进程不继承当前进程的打开文件/端口. 有关如何完成此任务的任何建议?我可以使用system()函数调用的Shell命令也可以工作 – 我只是不知道有一个好的shell命令来启用它. 谢谢! 解决方法 你没有指定你正在开发的语言,但既然你提
我想在OS X上启动子进程,以便子进程不继承当前进程的打开文件/端口.

有关如何完成此任务的任何建议?我可以使用system()函数调用的Shell命令也可以工作 – 我只是不知道有一个好的shell命令来启用它.

谢谢!

解决方法

你没有指定你正在开发的语言,但既然你提到了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;
}

希望有所帮助,

埃里克·梅尔斯基

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读