我在我的代码中执行以下步骤:
fork()
execv
运行外部脚本 While( waitpid(..., WNOHANG) == 0)
{
//Send signal that script has started with no error
..
}
我面临的问题是,如果脚本不可执行,我仍然会在上面的while循环中结束,并且我发送脚本已启动且没有错误的信号;这不是真的。
显然我可以先运行一个sys调用并确定脚本的权限,但是有更好的解决方案吗?
答案 0 :(得分:3)
捕获execve
错误非常棘手,原因很简单:您在子进程中看到了错误,但是您希望将错误传输到父进程。有一个很好的技巧可以实现:
在分叉之前,打开pipe
并设置close-on-exec标记(pipe2
和O_CLOEXEC
或fcntl
如果前者不是可在您的系统上使用。)
分叉后,让父母关闭管道的书写面并从阅读端读取。
在孩子中,关闭管道的读取端,然后尝试execve
。如果失败,请将errno
写入管道并_exit
。
在父级中,如果read
返回0,则execve
成功。这是因为成功的execve
关闭管道(因为它设置为close-on-exec)并在读取端导致EOF。否则,读取的值是错误代码。
答案 1 :(得分:0)
如果孩子在执行脚本后仍然存在,请让孩子退出(2)或其他值,并测试父循环内的退出值。但为什么循环呢?摆脱WNOHANG。