기본적으로 사용자 신호 SIGUSR1 및 SIGUSR2는 프로세스나 스레드를 종료합니다. 핸들러를 설정하려면 어떻게 해야 합니까? 이 주제에 대한 다양한 기사를 읽어보았지만 이 주제를 처음 접했기 때문에 필요에 따라 이전하는 것이 불가능했습니다.
요구 사항은 다음과 같습니다. 루프에서 일련의 명령을 실행하는 많은 생산자 스레드(pthread)가 있으며 각 반복이 끝날 때 주 소비자 스레드에서 신호(sigwait) SIGURS1을 기다리고 다음 스레드로만 이동합니다. 신호를 받은 후 반복합니다. 그러나 기본적으로 수행되므로 완료됩니다.
그것들. 여기서는 다음 반복으로 전환하기 위해 이러한 신호를 수신하면 프로세스가 완료됩니다.
답변1
신호 처리기를 설정하는 데 사용할 수 있는 API가 많이 있습니다. 그 중 하나의 예를 들어 보겠습니다.
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
static void signal_handler(int signo)
{
# define signal_message "Signal received\n"
write(1, signal_message, strlen(signal_message));
# undef signal_message
}
int main(void)
{
struct sigaction new_handler = {
.sa_handler = signal_handler,
};
if (sigaction(SIGUSR1, &new_handler, NULL) < 0) {
perror("sigaction");
}
pause();
return 0;
}
이 sigaction()
함수는 새로운 신호 처리기를 설치하며 그 서명은 다음과 같습니다:
int sigaction(int signum,
const struct sigaction *act,
struct sigaction *oldact);
첫 번째 매개변수는 신호 번호입니다(예를 들어 SIGUSR1
두 번째 매개변수는 핸들러 세부 정보가 있는 구조에 대한 포인터이고 struct sigaction
세 번째 매개변수는 struct sigaction
핸들러가 저장될 이전 값에 대한 포인터입니다. 세 번째 매개변수는 NULL
다음과 같습니다. 이전 값은 신경 쓰지 마세요.
필드 중 하나 struct sigaction
는 sa_handler
신호 처리 기능에 대한 포인터입니다. 함수의 서명은 다음과 같아야 합니다.
void function_name(int signo);
이 함수는 void
수신된 신호 번호를 매개변수로 반환하고 받아들입니다.
요약하자면, 예제에서는 신호 처리기를 설치 SIGUSR
한 다음 를 호출하여 pause()
신호가 수신될 때까지 실행을 중지합니다. 그런 다음 SIGUSR
이 코드를 실행하는 프로세스에 신호를 전달 하면 Signal received
표준 출력으로 인쇄됩니다.