- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个命令行应用程序。我面临的问题是,有时该应用程序的用户也会使用以下命令直接关闭我们的应用程序运行的终端:
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/
我相信我在子 shell 中调用 exit 会导致我的程序继续: #!/bin/bash grep str file | while read line do exit 0 done
我相信我在子 shell 中调用 exit 会导致我的程序继续: #!/bin/bash grep str file | while read line do exit 0 done
我有几个脚本,它们的第一部分看起来是一样的。这部分的功能是识别脚本在哪台机器上运行并相应地设置几个变量。它看起来像这样: ENV=`echo $LOGNAME | cut -c1-8` if
这是我正在尝试做的事情。我有 4 个 shell 脚本。脚本 1 需要先运行,然后是 2,然后是 3,然后是 4,并且它们必须按此顺序运行。脚本 1 需要运行(并在后台等待)2 才能正常运行,但是脚本
我有一个名为 a.sh 的脚本,其中的内容是: //a.sh: #!/bin/bash temp=0 while [ "$temp" -ne 500 ] do echo `date`
在snakemake中,使用shell()函数执行多个命令的推荐方式是什么? 最佳答案 您可以调用shell()多次内run规则块(规则可以指定 run: 而不是 shell: ): rule pro
我有一个 shell 脚本,我向其中传递了一些参数。Test1.sh -a 1 -b 2 -c“一二三” 在 Test1.sh 中,我按以下方式调用另一个 shell 脚本。Test2.sh $* 我
我有 2 个 shell 脚本。 第二个shell脚本包含以下函数第二个.sh func1 func2 first.sh 将使用一些参数调用第二个 shell 脚本, 将使用特定于该函数的一些其他参数
我有一个 Unix shell 脚本 test.sh。在脚本中,我想调用另一个 shell,然后从子 shell 执行 shell 脚本中的其余命令并退出 说清楚: test.sh #! /bin/b
我想在 shell 脚本中更改路径环境变量。路径变量需要在shell脚本执行后修改。 最佳答案 我知道有两种方法可以做到这一点。第一种是在当前 shell 的上下文中运行脚本: . myscript.
此 shell 脚本按预期运行。 trap 'echo exit' EXIT foo() { exit } echo begin foo echo end 这是输出。 $ sh foo.sh
我正在使用 vimshell在 vim 中执行命令 nnoremap vs :VimShellPop 使用此键映射,我可以打开 vim shell 并执行诸如“捆绑安装”之类的命令,然后 输入 exi
我想连接到不同的 shell(csh、ksh 等)并在每个切换的 shell 中执行命令。 下面是反射(reflect)我的意图的示例程序: #!/bin/bash echo $SHELL csh e
我目前正在尝试使用 BNF 和 LL 解析器在 C 中重新编写 shell。 否则,我需要知道 shell 运算符的优先级是什么| , > , > , & , ; ? 有没有人可以提供给我? 谢谢 最
不幸的是,我没有suspend 命令(busybox/ash)。但是我可以使用 kill -STOP $$ 从后台 shell (sh &) 返回到父 shell(以及 fg 之后)。 但是我不想输入
我需要知道,当用户切换到另一个 shell 时,通过单击它。 我试过 shellListener.shellDeactivated()但是当 shell 失去对它自己的控件的焦点时,会触发此事件,这意
file1.txt aaaa bbbb cccc dddd eeee file2.txt DDDD cccc aaaa 结果 bbbb eeee 如果能不区分大小写就更好了! 谢谢! 最佳答案 gre
我见过解压缩目录中所有 zip 文件的循环。但是,在运行此之前,我宁愿确保我将要运行的内容正常工作: for i in dir; do cd $i; unzip '*.zip'; rm -rf *.z
我对编程还很陌生,但我想知道 vim、emacs、nano 等 shell 文本编辑器如何能够控制命令行窗口。我主要是一名 Windows 程序员,所以可能在 *nix 上有所不同。据我所知,只能将文
我有一个包含第 7 列日期的文件,我的要求是将它与今天的日期进行比较,如果小于它,则删除该完整行。 此外,如果第 7 列中提到的任何日期超过 15 天,则将其修改为最多 15 天 下面的例子- now
我是一名优秀的程序员,十分优秀!