gpt4 book ai didi

c - 当进程的控制 shell 被杀死时优雅地终止进程

转载 作者:太空宇宙 更新时间:2023-11-04 11:05:20 25 4
gpt4 key购买 nike

我有一个命令行应用程序。我面临的问题是,有时该应用程序的用户也会使用以下命令直接关闭我们的应用程序运行的终端:

kill -9 pid_of_parent_console

在上述情况下,我们的应用程序应该通过执行所有必要的清理工作正常关闭。为此,我编写了一个信号处理程序来处理 SIGHUP 信号,因为当控制进程的终端退出时,它会将 SIGHUP 发送到在其下运行的进程,我们已经处理它以优雅地退出我们的进程。但问题是,如果用户打开终端,假设是默认 bash,然后他再次在其中键入 bash 命令,然后运行我们的应用程序,如果假设在打开终端后杀死了 bash 手动执行的应用程序父进程,那么我们的应用程序不会收到 SIGHUP 并且不会正常退出。为简单起见,我写了下面的代码重现了这个问题:

#include <stdio.h>
#include <signal.h>

FILE *fp = NULL;
int flag = 1;

void handler(int signum)
{
flag = 0;
}

int main()
{
signal(SIGHUP, handler);
// just for testing
fp = fopen("file", "w");

// loop terminates only when HUP is generated
while (flag);

// if SIGHUP is generated then code should reach here
// and write the below in file.
fprintf(fp, "SIGHUP Generated");

fclose(fp);
return 0;
}

为简单起见,我没有使用 sigaction 来处理信号。

我观察到的是,当我打开一个终端并按 tty 命令并记下与之相关联的标准输入文件的名称,然后在同一终端中输入 bash 命令并再次记下标准输入文件时使用 tty 命令与其相关联,我发现这两个 bash shell,一个在我启动终端时默认打开的,一个我通过在 bash 控制台中键入 bash 命令手动打开的,共享相同的标准输入文件名。

因此,当我杀死作为我进程父进程的第二个 bash 时,与其关联的标准输入文件不会关闭,我认为这就是我没有收到 SIGHUP 信号的原因。

当它的控制控制台被终止时,是否有任何其他方法可以让我过于优雅地终止我的进程。

使用的终端模拟器:GNOME Terminal 2.31.3默认外壳:bash

最佳答案

无论操作系统如何,SIGKILL(即信号 -9)都由内核直接处理,并且在任何用户态处理程序有机会处理任何内容之前进程被终止.就像 Solaris 内核一样,Linux 内核也是如此。

然后目标进程就没有办法保护自己免受该信号的影响(在发送方或内核中拦截它)。

另一方面,关闭终端仿真器窗口会向它发送一个 XEvent。在退出之前,终端仿真器可能应该向您的进程发送一个 SIGHUP 信号。

我建议在 Solaris 10 机器上使用 dtrace 来调查这个过程。从显示所有已发送信号的脚本开始:http://www.brendangregg.com/DTrace/kill.d

关于c - 当进程的控制 shell 被杀死时优雅地终止进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25489577/

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