【问题标题】:Standard approach to determine success or failure of fork/exec (while parent is running simultaneously)?确定 fork/exec 成功或失败的标准方法(同时父级同时运行)?
【发布时间】:2011-09-25 16:16:36
【问题描述】:

我使用fork()exec*() 制作了一个程序。问题是我无法从父进程中确定exec() 的成功或失败,因为它位于分离的子进程中。我认为可以使用某种信号来检查这种状态,但我对此一无所知。

  1. 推荐/标准/广泛使用的检查方法是什么?
  2. 在执行此操作时我必须注意哪些陷阱?

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

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

【问题讨论】:

  • 您知道您可以使用waitpidWNOHANG 选项在不阻塞的情况下查询子状态吗?根据您的系统,您可能还拥有wait3wait4,它们也理解此标志。或者你想在保持孩子运行的同时向父母发出信号(比如使用 IPC 信号量)?
  • @DarkDust 我想保持两个进程都在运行,并且我想通知子进程'exec 状态。 (成功或失败)哦,你解决了我的问题。谢谢:)
  • What can cause exec to fail? What happens next? 的可能重复项(特别是,请参阅the answer from "R."

标签: unix exec fork


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多