KDE KonsoleはSIGTERMをどのように処理しますか?

KDE KonsoleはSIGTERMをどのように処理しますか?

特定の設定があります。

  • プログラムmanagerはプログラムを開始および停止できます。
  • プログラムwrapperは次の部分で構成されています。
    • Konsole
    • workerまでプログラムが実行されますKonsole

私の質問は次のとおりです

manager送信されると、その子に送信されるように見えます(信号がブロックされていないように見えるため)。SIGTERMkonsolekonsoleSIGKILLworker

テスト

ワーカーコード:

#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

ベストアンサー1

konsole部分的な答えは、直接実行するのではなく小さなスクリプトを実行することです。

#!/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このソリューションは、閉じるボタンを介して閉じる時期を処理しないため、完璧ではありませんが、元の問題を解決します。

おすすめ記事