인디노트

linux 에서 C 로 대기하고 있다가 시그널을 발생하여 다른 함수에서 시그널을 보내면 깨어나서 함수를 실행하는 C 코드 본문

개발 플랫폼 및 언어/네트워크 기술

linux 에서 C 로 대기하고 있다가 시그널을 발생하여 다른 함수에서 시그널을 보내면 깨어나서 함수를 실행하는 C 코드

인디개발자 2023. 4. 15. 14:05

Linux에서 시그널 처리를 위해서는 signal() 함수를 사용하여 시그널 핸들러 함수를 등록해야 합니다. 시그널 핸들러 함수는 시그널이 발생했을 때 실행됩니다.

대기 상태에서 시그널이 발생하면, 시그널 핸들러 함수가 호출되어 해당 시그널에 대한 처리를 수행합니다. 그러면 대기 중인 함수가 깨어나서 시그널 핸들러 함수를 실행하고, 이후에 다시 대기 상태로 들어갑니다.

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

void signal_handler(int signal_num) {
    printf("Received signal %d\n", signal_num);
}

int main() {
    signal(SIGUSR1, signal_handler); // SIGUSR1 시그널 핸들러 등록

    while(1) {
        printf("Waiting for signal...\n");
        sleep(5); // 5초간 대기
    }

    return 0;
}

 

위 코드에서는 signal_handler() 함수를 정의하여 SIGUSR1 시그널을 처리합니다. signal() 함수를 사용하여 SIGUSR1 시그널 핸들러 함수를 등록하고, 무한 루프에서 대기합니다. 5초마다 "Waiting for signal..."을 출력하고 대기하며, SIGUSR1 시그널이 발생하면 signal_handler() 함수가 호출되어 "Received signal %d"를 출력합니다.

다른 함수에서 SIGUSR1 시그널을 보내려면 kill() 함수를 사용하면 됩니다. 예를 들어, 다음과 같은 코드를 사용하여 SIGUSR1 시그널을 보낼 수 있습니다.

#include <signal.h>
#include <unistd.h>

int main() {
    pid_t pid = getpid(); // 현재 프로세스 ID를 가져옴
    kill(pid, SIGUSR1); // 현재 프로세스에 SIGUSR1 시그널 보냄

    return 0;
}

 

위 코드에서는 getpid() 함수를 사용하여 현재 프로세스 ID를 가져온 후, kill() 함수를 사용하여 현재 프로세스에 SIGUSR1 시그널을 보냅니다. 이러면 대기 중인 함수가 깨어나서 signal_handler() 함수를 실행하게 됩니다.

반응형
Comments