killall -SIGINT를 통해 시스템 호출이나 스크립트를 실행할 때 프로세스에 SIGINT 신호를 보냅니다.

killall -SIGINT를 통해 시스템 호출이나 스크립트를 실행할 때 프로세스에 SIGINT 신호를 보냅니다.

SIGINT를 모든 프로세스에 이름으로 보내고 싶어서 killall -SIGINT를 사용했는데 잘 작동했습니다. 이제 C 코드에 system() 호출을 도입하여 셸 스크립트나 셸 명령을 실행했는데, 완료하는 데 약 10초가 걸립니다. 이 경우 신호를 보낼 때 신호 처리기가 호출되지 않는 것을 발견했습니다.

백그라운드에서 제거하거나 실행하면 시스템 호출이 다시 작동하기 시작했습니다.

누구든지 관리 방법을 제안해 주실 수 있나요?

답변1

system(3)의 매뉴얼 페이지에서 -

system()  executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed.  During execution of the
       command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored.

신호가 모든 프로세스(이름으로 지정)로 전송되더라도 여기서 상위 프로세스는 system() 호출 중에 SIGINT를 무시합니다. 그러나 호출이 완료되면 응답해야 합니다(귀하의 경우 sleep() 중). 절전 창을 늘려 보셨나요?

답변2

#include<stdio.h>
#include <signal.h>
 void signalHandler(int);
int main()
{
    struct sigaction sa;
    sa.sa_flags = 0;
    // Setup the signal handler
    sa.sa_handler = signalHandler;
    // Block every signal during the handler
    sigfillset(&sa.sa_mask);  
    if (sigaction(SIGINT, &sa, NULL) == -1) {
    printf("Error: cannot handle SIGINT\n"); 
}

    while(1)
    {
        printf("Start to ping google.com");
        system("ping www.google.com -c 1");
        printf("Stop to ping google.com\n");
        sleep(1);
    }

}

void signalHandler(int signal)
{
    printf("signalHandler: signal = %d\n", signal); 
}

관련 정보