psy*_*tik 3 unix macos process
我想在OS X上启动子进程,以便子进程不继承当前进程的打开文件/端口.
有关如何实现这一目标的任何建议?我可以使用system()函数调用的Shell命令也可以工作 - 我只是不知道有一个好的shell命令来启用它.
谢谢!
Eri*_*ski 11
您没有指定您正在开发的语言,但自从您提到以来system(),我认为您的意思是C或C++.
通常,这是通过使用fcntl()在您不希望继承的那些文件描述符上设置close-on-exec标志来实现的:
int fd = open("somefile", O_RDONLY);
fcntl(fd, F_SETFD, FD_CLOEXEC);
Run Code Online (Sandbox Code Playgroud)
您也可以通过在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;
}
Run Code Online (Sandbox Code Playgroud)
希望有所帮助,
埃里克·梅尔斯基
| 归档时间: |
|
| 查看次数: |
2312 次 |
| 最近记录: |