0

我在 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 ?

4

2 回答 2

1

我不知道“3”是做什么的。

如果您想更改子进程可用的文件描述符,则不要在调用execor中执行此fork操作,而是通过调用close,dup2等来执行此操作。该函数posix_spawn基本上为您执行此操作,并且在 Linux/glibc 上,它是使用forkand实现exec的(因此您可以阅读源代码...)

pid = fork();
if (!pid) {
    // close, dup2 go here
    exec(...);
    // error
}
于 2011-07-05T23:57:18.673 回答
0

3 表示您传递给 fd_map 的文件描述符的数量,并且在 spawnp() 调用中,它允许您方便地仅选择要传递给子进程的那些文件描述符。

因此,在您调用 fork() 之后,您将拥有子进程中的所有文件描述符,因此您可以关闭那些您不感兴趣的文件描述符,然后假设文件描述符未标记为 CLOEXEC(关闭exec) 他们也将执行到 exec() 的代码。

请注意,如果您的应用程序是多线程的,fork() 将失败,因为直到最近的版本,QNX 不支持分叉线程进程。

于 2011-10-12T12:20:07.670 回答