【问题标题】:Convert call from spawn to fork-exec in C在 C 中将调用从 spawn 转换为 fork-exec
【发布时间】:2011-07-05 23:49:46
【问题描述】:

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

【问题讨论】:

  • 将代码“看起来像...Linux”转换为“Linux 等效”是什么意思?
  • 抱歉不清楚,编辑了问题。

标签: linux qnx


【解决方案1】:

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

如果你想改变子进程可用的文件描述符,你不要在调用execfork时这样做,而是通过调用closedup2等.posix_spawn这个函数基本上是为你做这个的,而在Linux/glibc上,它是使用forkexec实现的(所以你可以阅读源代码...)

pid = fork();
if (!pid) {
    // close, dup2 go here
    exec(...);
    // error
}

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-05
      • 2019-01-05
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      相关资源
      最近更新 更多