我的代码在Linux中看起来像这样:
return_code= spawnp(cmd, 3, fd_map, NULL, argv, environ);
我需要将它从QNX转换为Linux - 所以我需要使用fork-exec,因为spawn在Linux中不可用。 1)怎么做?这是正确的吗 ?
pid = fork();
if (pid ==0) /* child */
exec(cmd, argv, environ);
2)如何将在spawn中传递的参数fd_map和“3”传递给exec?
答案 0 :(得分:1)
我不知道“3”是做什么的。
如果要更改子进程可用的文件描述符,请不要在调用exec
或fork
时执行此操作,但可以通过调用close
来完成此操作,dup2
等。函数posix_spawn
基本上是为你做的,在Linux / glibc上,它是使用fork
和exec
实现的(所以你可以阅读源码代码...)
pid = fork();
if (!pid) {
// close, dup2 go here
exec(...);
// error
}
答案 1 :(得分:0)
3表示您传入fd_map的文件描述符的数量,在spawnp()调用中,它允许您方便地仅选择要传递给子进程的文件描述符。
因此,在调用fork()之后,您将拥有子进程中的所有文件描述符,以便您可以关闭那些您不感兴趣的文件描述符,然后假设文件描述符未标记为CLOEXEC (关闭exec)他们也将继续执行exec()'ed代码。
请注意,如果您的应用程序是多线程的,fork()将失败,因为在最新版本之前,QNX不支持分支线程进程。