首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KDE Konsole是如何处理SIGTERM的?

KDE Konsole是如何处理SIGTERM的?
EN

Unix & Linux用户
提问于 2019-10-02 15:25:22
回答 1查看 126关注 0票数 0

我有一个特殊的设置:

  • 一个manager程序可以启动和停止一个程序。
  • 一个wrapper程序,由:组成
    • Konsole
    • 一个程序worker运行在Konsole中。

我的问题是:

managerSIGTERM发送到konsole时,konsole似乎将SIGKILL发送给其子节点(因为worker似乎没有截获任何信号)。

测试

工人代码:

代码语言:javascript
复制
#include 
#include 
#include 
#include 

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;
}

测试工作者

代码语言:javascript
复制
gcc worker.c 

./a.out &
pkill -15 a.out
sleep 2
pkill -9 a.out

a.trace的内容与预期的一样:

代码语言:javascript
复制
got 15

问题在使用Konsole

时出现

代码语言:javascript
复制
konsole -e ./a.out &

pkill -15 konsole # warning, maybe other konsole processes running    

a.trace是空的,我认为是因为它接收到了一个SIGKILL

  • 我说的对吗?
  • 我如何让Konsole翻译SIGTERM
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-10-04 10:17:32

一个部分的答案是直接启动一个小脚本而不是konsole

代码语言:javascript
复制
#!/bin/bash

#SIGTERM handler
on_term () {
    echo "SIGTERM got, sending to worker"
    kill -TERM $WORKERID
}

#intercept SIGTERM
trap _term SIGTERM

# launch console 
konsole --hide-menubar --hide-tabbar --nofork -e worker &

#get Konsole pid
KONSOLEID=$!

# wait for worker to be launched
sleep 1

# get worker pid 
WORKERID=$(pgrep -P $KONSOLEID worker )

echo "worker is running under pid: $WORKERID"

# wait for one child end
wait

echo "worker terminated"

这个解决方案并不完美,因为当Konsole通过关闭按钮关闭时,它不会处理,但是它解决了最初的问题。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/544796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档