gpt4 book ai didi

c - 如何正确地将被杀死的子进程的退出状态传递给外壳程序?

转载 作者:行者123 更新时间:2023-11-30 16:39:24 25 4
gpt4 key购买 nike

(我正在开发一个简单的类似 的程序。)

例如我有一个程序 prog1.c其中fork()exec()另一个程序prog2 。当prog2被信号杀死(例如 SIGPIPE ), prog1可以通过 waitpid() 获取其退出状态, WIFSIGNALED()WTERMSIG() 。然后prog1会将退出状态传递给 prog1的调用者(一个 shell,如 Bash 或 Ksh93),我想让它看起来像是调用 prog2 的 shell所以我希望 shell 获得准确的退出状态 prog2 .

我能想到的一种方法是 prog1用杀死 prog2 的信号来自杀但这听起来有点奇怪,所以我想知道是否还有其他更好的方法来做到这一点。

最佳答案

将评论转换为答案。

如果您希望报告的状态准确(信号状态也是如此),您必须准确地按照您的建议进行:

int status;
int corpse = wait(&status);
if (WIFSIGNALED(status))
kill(getpid(), TERMSIG(status));
else
exit(WEXITSTATUS(status));

请注意,Bash 通过使用 128 + signal_number 正常退出的信号来报告子进程的死亡。您可能仍然遇到核心转储问题。您可能需要以稍微不同的方式处理某些信号(例如作业控制信号)。

I only deal with scenarios where the child exits so would not handle things like WIFSTOPPED or WIFCONTINUED. Core dump is indeed something I have to think. Not sure if a C program can decide whether or not to dump a core but still be able to tell the caller that it's SIGSEGVed.

有时有操作系统特定的接口(interface)来控制核心转储。例如,POSIX 提供 getrlimit() setrlimit() 可以将核心转储的大小限制为 0,防止核心转储。如果信号最初在孙子进程中提供了核心转储,那么它也可能会为子进程提供核心转储 - 但这可能是一个问题,因为子进程的核心会覆盖孙子进程的核心,从而使您没有相关信息。我不确定您需要在多大程度上担心这个问题,或者您可以使用特定于操作系统的机制来处理它。我不知道即使未创建核心,您是否会设置“核心转储”位;可能不会。

关于c - 如何正确地将被杀死的子进程的退出状态传递给外壳程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47067560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com