我有一个特定的设置:
- 一个
manager
程序可以启动和停止一个程序。 - 一个
wrapper
程序由以下部分组成:Konsole
.- 一个程序
worker
运行到Konsole
.
我的问题是:
当manager
发送SIGTERM
到 时konsole
,konsole
似乎发送SIGKILL
给它的孩子(因为worker
似乎没有截获任何信号)。
测试
工人代码:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int last_sig = 0;
void sig_handler(int sig) {
last_sig = sig;
}
int main(void)
{
FILE * f = fopen("a.trace", "w");
signal(SIGTERM, sig_handler);
signal(SIGKILL, sig_handler);
signal(SIGQUIT, sig_handler);
while(1) {
if (last_sig) {
fprintf(f, "got %d\n", last_sig);
fflush(f);
last_sig = 0;
}
else
sleep(100); # sleep is interrupted on signal
}
fclose(f);
return 0;
}
测试人员
gcc worker.c
./a.out &
pkill -15 a.out
sleep 2
pkill -9 a.out
内容a.trace
符合预期:
got 15
使用 Konsole 时出现问题
konsole -e ./a.out &
pkill -15 konsole # warning, maybe other konsole processes running
a.trace
是空的,我认为这是因为它收到一个SIGKILL
.
- 我对吗?
- 我怎么知道
Konsole
要翻译SIGTERM
?
一个部分答案是启动一个小脚本而不是
konsole
直接启动:这个解决方案并不完美,因为它不处理
Konsole
关闭按钮何时关闭,但它解决了最初的问题。