C++ 如何确保孩子们在接到高管电话后仍然活着?

C++ 如何确保孩子们在接到高管电话后仍然活着?,c++,c,linux,system,C++,C,Linux,System,是否有一种安全的方法或常规做法可以确保我的withexecvp执行的孩子生活在良好的状态 例如:我让程序的用户为程序中的一些数据选择一个自定义处理器(假设他想用bzip2-zc-处理它们)。我使用通常的fork(),execvp()创建这个过程,并为每个stdin、stdout和stderr创建一个管道(),dup2()。但我无法影响用户是否给了我正确的命令调用,或者是因为某些参数错误而导致的死亡(例如,他可能给我cat foo,但文件foo不存在,因此cat将立即退出) 我是否可以确保至少在我

是否有一种安全的方法或常规做法可以确保我的with
execvp
执行的孩子生活在良好的状态

例如:我让程序的用户为程序中的一些数据选择一个自定义处理器(假设他想用
bzip2-zc-
处理它们)。我使用通常的
fork()
execvp()
创建这个过程,并为每个stdin、stdout和stderr创建一个
管道(),dup2()
。但我无法影响用户是否给了我正确的命令调用,或者是因为某些参数错误而导致的死亡(例如,他可能给我
cat foo
,但文件foo不存在,因此cat将立即退出)


我是否可以确保至少在我执行此用户命令之后,在我开始向其输入之前,它处于良好状态—等待我的输入—并且尚未死亡或死亡?

如果将父亲连接到孩子的管道关闭,父亲将收到SIGPIPE。如果孩子死了,所有这些管道都会关闭,因此会发送一个SIGPIPE。

如果连接他和孩子的管道关闭,父亲将收到一个SIGPIPE。如果孩子死了,所有这些管道都会关闭,因此会发送一个SIGPIPE。

如果连接他和孩子的管道关闭,父亲将收到一个SIGPIPE。如果孩子死了,所有这些管道都会关闭,因此会发送一个SIGPIPE。

如果连接他和孩子的管道关闭,父亲将收到一个SIGPIPE。如果孩子死了,所有这些管道都会关闭,因此会发送一个SIGPIPE。

您可以使用

waitpid(ChildPID, &status, WNOHANG); 
如果返回
0
,则表示孩子还活着。

您可以使用

waitpid(ChildPID, &status, WNOHANG); 
如果返回
0
,则表示孩子还活着。

您可以使用

waitpid(ChildPID, &status, WNOHANG); 
如果返回
0
,则表示孩子还活着。

您可以使用

waitpid(ChildPID, &status, WNOHANG); 


如果返回
0
则表示该子项处于活动状态。

检查您的写入是否成功。如果管道另一端的子级在未读取任何数据的情况下死亡,则写入操作将失败,并且(通常)将获得一个SIGPIPE和一个SIGCHLD。请检查您的写入是否成功。如果管道另一端的子级在未读取任何数据的情况下死亡,则写入操作将失败,并且(通常)将获得一个SIGPIPE和一个SIGCHLD。请检查您的写入是否成功。如果管道另一端的子级在未读取任何数据的情况下死亡,则写入操作将失败,并且(通常)将获得一个SIGPIPE和一个SIGCHLD。请检查您的写入是否成功。如果管道另一端的子进程在没有读取任何数据的情况下死亡,则写入操作将失败,并且(通常)将获得一个SIGPIPE和一个SIGCHLD。我相信父进程只有在尝试对封闭管道进行
写入
或尝试从这样的管道读取时,才会获得
SIGPIPE
。如果父级两者都没有,则不需要关心子级是否正在运行。至少在这种情况下(用户定义的转换器)。sry用于延迟重播。这就是我目前为防止撞车和不当行为所做的。但是这使得错误处理猜测充其量只能起作用-你永远不知道孩子为什么死了(就像我的错误命令字符串示例一样)。要了解更多信息,你必须查看退出代码并捕获孩子的stdout和stderr。我认为,任何其他方法(如使用
strace
或类似方法)都会有过大的杀伤力。我相信父进程只有在尝试
在封闭管道上写入
或尝试从这样的管道读取时,才会得到
SIGPIPE
。如果父级两者都没有,则不需要关心子级是否正在运行。至少在这种情况下(用户定义的转换器)。sry用于延迟重播。这就是我目前为防止撞车和不当行为所做的。但是这使得错误处理猜测充其量只能起作用-你永远不知道孩子为什么死了(就像我的错误命令字符串示例一样)。要了解更多信息,你必须查看退出代码并捕获孩子的stdout和stderr。我认为,任何其他方法(如使用
strace
或类似方法)都会有过大的杀伤力。我相信父进程只有在尝试
在封闭管道上写入
或尝试从这样的管道读取时,才会得到
SIGPIPE
。如果父级两者都没有,则不需要关心子级是否正在运行。至少在这种情况下(用户定义的转换器)。sry用于延迟重播。这就是我目前为防止撞车和不当行为所做的。但是这使得错误处理猜测充其量只能起作用-你永远不知道孩子为什么死了(就像我的错误命令字符串示例一样)。要了解更多信息,你必须查看退出代码并捕获孩子的stdout和stderr。我认为,任何其他方法(如使用
strace
或类似方法)都会有过大的杀伤力。我相信父进程只有在尝试
在封闭管道上写入
或尝试从这样的管道读取时,才会得到
SIGPIPE
。如果父级两者都没有,则不需要关心子级是否正在运行。至少在这种情况下(用户定义的转换器)。sry用于延迟重播。这就是我目前为防止撞车和不当行为所做的。但是这使得错误处理猜测充其量只能起作用-你永远不知道孩子为什么死了(就像我的错误命令字符串示例一样)。要了解更多信息,你必须查看退出代码并捕获孩子的stdout和stderr。我认为,其他任何东西(比如使用
strace
或类似的工具)都是杀伤力过大的。