Waitpid用于执行不可执行脚本的子进程

时间:2014-07-14 17:14:32

标签: c++ c

我在我的代码中执行以下步骤:

  • fork()
  • 子进程中的
  • execv运行外部脚本
  • 父进程中的

 While( waitpid(..., WNOHANG) == 0)
 {
     //Send signal that script has started with no error
      ..
 }

我面临的问题是,如果脚本不可执行,我仍然会在上面的while循环中结束,并且我发送脚本已启动且没有错误的信号;这不是真的。

显然我可以先运行一个sys调用并确定脚本的权限,但是有更好的解决方案吗?

2 个答案:

答案 0 :(得分:3)

捕获execve错误非常棘手,原因很简单:您在子进程中看到了错误,但是您希望将错误传输到父进程。有一个很好的技巧可以实现:

  1. 在分叉之前,打开pipe并设置close-on-exec标记(pipe2O_CLOEXECfcntl如果前者不是可在您的系统上使用。)

  2. 分叉后,让父母关闭管道的书写面并从阅读端读取。

  3. 在孩子中,关闭管道的读取端,然后尝试execve。如果失败,请将errno写入管道并_exit

  4. 在父级中,如果read返回0,则execve成功。这是因为成功的execve关闭管道(因为它设置为close-on-exec)并在读取端导致EOF。否则,读取的值是错误代码。

答案 1 :(得分:0)

如果孩子在执行脚本后仍然存在,请让孩子退出(2)或其他值,并测试父循环内的退出值。但为什么循环呢?摆脱WNOHANG。

相关问题