确定fork/exec成功或失败的标准方法(父进程同时运行)?

Eon*_*nil 7 unix fork exec

我使用fork()和制作了一个程序exec*().问题是我不能确定exec()来自父进程的成功或失败,因为它是在分离的子进程上.我认为可以使用某种信令来检查这种状态,但我不知道这一点.

  1. 什么是推荐/标准/广泛使用的方式来检查这个?
  2. 在做这件事时我有什么陷阱?

问题详情更新(很抱歉遗漏重要细节)

我想保持两个进程都在运行,所以我不能等待退出子进程.换句话说,我希望收到关于子进程exec成功或失败的通知.

P.T*_*.T. 7

您的父进程可以使用子进程的pid来检测它是活动的还是已经退出(并且可以消除错误代码的歧义,并且由于信号错误而死亡,请参阅waitpid).您可以使用某些错误代码或信号来通知父母特定的错误情况(例如,在执行前的分叉子项中),但对于完全通用的子项,您可能无法保留任何退出代码或信号(因为父母将无法判断exec是否成功,然后孩子退出这些值).

经常使用的另一种方法是创建一个管道fd对(参见'pipe'syscall),并将一端传递给子端(通常是写端),另一端传递给父端.孩子可以使用它将特定的错误代码发送给父母.如果管道关闭而没有获得任何数据,父母可以检测到提​​前终止.存在一些缺陷:如果在没有活动编写器的管道上读取SIGPIPE将被发送到父级,并且在子进程中使用fd(stdin/stdout/stderr除外)可能会混淆一些写得不好的子进程(虽然close-on-exec可以帮助解决这个问题).

一般来说,我见过的使fork + exec健壮的所有代码都非常糟糕.