Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何知道进程在unix中何时被终止_Unix_Ubuntu - Fatal编程技术网

如何知道进程在unix中何时被终止

如何知道进程在unix中何时被终止,unix,ubuntu,Unix,Ubuntu,我正在从事一个Spark项目,该项目有一个可执行文件,在后台启动进程,现在我需要知道进程何时通过Bash终止。我得到的唯一解决方案是通过grep in loop不断检查其PID存在性(如果存在或不存在),是否有任何其他可能的解决方案可以做到这一点而无需循环。 我也尝试过处理退出代码,但是如果进程运行,并且只有在终止时才更改退出代码,则退出代码为0,这需要持续检查。可能需要更多的上下文。。。如果您的可执行文件正在启动进程,那么肯定有一种方法可以在执行过程中获取或保留句柄 在php中有proc_op

我正在从事一个Spark项目,该项目有一个可执行文件,在后台启动进程,现在我需要知道进程何时通过Bash终止。我得到的唯一解决方案是通过grep in loop不断检查其PID存在性(如果存在或不存在),是否有任何其他可能的解决方案可以做到这一点而无需循环。
我也尝试过处理退出代码,但是如果进程运行,并且只有在终止时才更改退出代码,则退出代码为0,这需要持续检查。

可能需要更多的上下文。。。如果您的可执行文件正在启动进程,那么肯定有一种方法可以在执行过程中获取或保留句柄

在php中有proc_open(),在Qt中有QProcess类,在c/c++中有popen()


许多语言都有此功能,但如果没有更多细节,很难提供解决方案。

如果我理解正确,情况如下:

您的可执行文件在某个地方执行fork,并在另一个进程中运行另一个逻辑,您希望主进程得到fork进程是否仍在运行的通知

为了回答这个问题,我将确保我们都熟悉相同的术语:

主进程(运行可执行文件时)称为父进程

父进程启动的进程称为子进程

现在,当子进程死亡时,一个信号
SIGCHLD
被发送到父进程,通常
SIGCHLD
被映射到
SIG_-DFL
,这实际上是
SIGCHLD
信号。用人类的话来说,这意味着如果子进程死亡,那么父进程就不会大便

但是,如果希望获得通知,则可以更改发送
SIGCHLD
时发生的行为。为此,您必须实现
信号处理程序
功能:

void custom_sigchld_handler(int sig)
{
    pid_t p;
    int   status;

    while ((p = waitpid(-1, &status, WNOHANG)) != -1)
    {
       // If you got here it means p is a dead process. Do your logic here... 
    }
}
然后,您必须声明希望我们的
自定义\u sigchld\u处理程序处理
sigchld
信号:

struct sigaction signal_action = {0};   
signal_action.sa_handler = custom_sigchld_handler;
sigaction(SIGCHLD, &signal_action, NULL);

你在用什么编程语言?请将您的问题包括在可执行文件中的相关源代码中,这样我们就有了改进它的起点。我也这么想,但由于他正在修改pid,我们不能假设这是一个fork或甚至是一个system()调用,或者就这一点而言,它甚至是在C:)