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

时间:2011-09-25 16:16:37

标签: unix exec fork

我使用fork()exec*()创建了一个程序。问题是我无法确定父进程中exec()的成功或失败,因为它位于已分离的子进程上。我认为可以使用某种信令来检查这种状态,但我不知道这一点。

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

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

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

1 个答案:

答案 0 :(得分:7)

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

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

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