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이 솔루션은 닫기 버튼을 통해 닫을 시기를 처리하지 않기 때문에 완벽하지는 않지만 원래 문제를 해결합니다.

관련 정보