Linux 스레드 간 통신을 위한 신호 (18)
1. Linux 스레드 간 통신을 위한 신호
Linux에서 각 프로세스에는 자체 신호 마스크가 있습니다. 이 신호 마스크는 어떤 신호가 차단되고 어떤 신호가 차단되지 않을지 지정하며 일반적으로 sigmask를 호출하여 처리됩니다. 동시에, 각 프로세스에는 자체 신호 작업도 있습니다. 이 작업 집합은 신호를 처리하는 방법을 지정합니다. 일반적으로 이를 처리하기 위해 Sigaction이 호출됩니다.
2. 신호 설치 기능
int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);
기능:
신호 처리 기능을 설정하려면 신호 번호를 지정합니다.
매개변수:
signum: 신호 번호.
act: sigaction 구조의 인스턴스에 대한 포인터입니다.
oldact: 원래 신호 처리를 저장하는 데 사용되며 NULL일 수 있습니다.
반환 값:
성공: 0.
실패: -1.
3. 신호 설정 기능에 모든 신호를 추가합니다.
int sigfillset(sigset_t * set);
기능:
sigfillset()은 매개변수 세트 신호 세트를 초기화하고 모든 신호를 이 신호 세트에 추가하는 데 사용됩니다.
매개변수:
set: 신호 세트 식별자의 주소 앞으로 이 신호 세트를 작동하려면 해당 세트를 작동하면 됩니다.
반환 값:
성공: 0.
실패: -1.
4. 신호 설정 기능에 신호 추가
int sigaddset(sigset_t *set, int signum);
기능:
이 신호 세트에 신호를 추가합니다.
매개변수:
set: 신호 세트 식별자의 주소 앞으로 이 신호 세트를 작동하려면 해당 세트를 작동하면 됩니다.
signum: 신호 번호.
반환 값:
성공: 0.
실패: -1.
5.신호 설정 기능 초기화
int sigemptyset(sigset_t *set);
기능:
신호 세트를 초기화합니다.
매개변수:
set: 신호 세트 식별자의 주소 앞으로 이 신호 세트를 작동하려면 해당 세트를 작동하면 됩니다.
반환 값:
성공: 0.
실패: -1.
6. 스레드에 신호 기능 보내기
int pthread_kill(thread_t tid, int sig);
기능:
스레드에 신호를 보냅니다.
매개변수:
tid: 스레드 ID.
sig: 신호 번호.
반환 값:
성공: 0.
실패: -1.
7. 호출 스레드의 신호 마스크 기능을 변경하거나 확인합니다.
int pthread_sigmask(int how, const sigset_t *act, sigset_t *oldact);
기능:
호출 스레드의 신호 마스크를 변경하거나 확인합니다.
매개변수:
방법: 현재 신호 마스크에 대한 세트를 추가, 삭제 또는 대체합니다.
act: 신호를 차폐하는 단어.
oldact: NULL이면 괜찮습니다.
설명 방법:
SIG_BLOCK: 결과 집합은 현재 설정된 매개변수 집합의 합집합입니다(신호 마스크 단어에 매개변수 집합의 신호를 추가합니다). SIG_UNBLOCK: 결과 집합은 현재 설정된 매개변수 집합의
차이 집합입니다(신호 설정 마스크 단어를 매개변수 세트의 매개변수 세트 신호에 적용)
SIG_SETMASK: 결과 세트는 매개변수 세트가 가리키는 세트입니다(신호 마스크 단어에서 매개변수 세트의 신호를 제거).
반환 값:
성공: 0.
실패: -1.
8. 참조 코드:
//=============================================================================
// File Name : thread_signal.c
// Author : FengQQ
//
// Description : 信号
// Annotation :
//
// int pthread_kill(pthread_t thread,int sig);
// 向线程thread发送sig信号,成功返回0,失败返回错误码
//
// int sigaction(int signum,const truct sigaction *act,struct sigaction *oldact);
// 为信号signum设置处理函数,处理函数在sigaction中指定
// act.sa_mask 信号屏蔽字
// act.sa_handler 信号集处理程序
//
// int pthread_sigmask(int how,const sigset_t *set,sigset_t *oldset);
// 多线程信号屏蔽函数
// how = SIG_BLOCK:向当前的信号掩码中添加set,其中set表示要取消阻塞的信号组。
// SIG_UNBLOCK: 向当前的信号掩码中删除set,其中set表示要取消阻塞的信号组。
// SIG_SETMASK: 将当前的信号掩码替换为set,其中set表示新的信号掩码。
// 在多线程中,新线程的当前信号掩码会继承创造它的线程的信号掩码
//
// Created by FengQQ. 2020-10-05
//=============================================================================
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <errno.h>
//-------------信号回调函数1-----------------
void sig_handler1(int arg)
{
printf("pthread1 get signal\r\n");
return;
}
//-------------信号回调函数2-----------------
void sig_handler2(int arg)
{
printf("pthread2 get signal\r\n");
return;
}
//---------------线程函数1------------------
void *pthread1_callback(void *arg)
{
struct sigaction act;
printf("new pthread 1\r\n");
memset(&act,0,sizeof(act)); //将act的内存空间填入0
sigaddset(&act.sa_mask,SIGQUIT); //添加一个信号至信号集
act.sa_handler = sig_handler1;
sigaction(SIGQUIT,&act,NULL); //查询或设置信号处理方式
pthread_sigmask(SIG_BLOCK,&act.sa_mask,NULL);
sleep(2);
}
//---------------线程函数2------------------
void *pthread2_callback(void *arg)
{
struct sigaction act;
printf("new pthread 2\r\n");
memset(&act,0,sizeof(act)); //将act的内存空间填入0
sigaddset(&act.sa_mask,SIGQUIT); //添加一个信号至信号集
act.sa_handler = sig_handler2;
sigaction(SIGQUIT,&act,NULL); //查询或设置信号处理方式
//pthread_sigmask(SIG_BLOCK,&act.sa_mask,NULL);
sleep(2);
}
int main(int argc,char *argv[])
{
int ret;
int signal_value;
pthread_t ptid1,ptid2;
ret = pthread_create(&ptid1,NULL,pthread1_callback,NULL);
if(ret != 0)
{
printf("create new pthread1 failed...\r\n");
return -1;
}
ret = pthread_create(&ptid2,NULL,pthread2_callback,NULL);
if(ret != 0)
{
printf("create new pthread2 failed...\r\n");
return -1;
}
sleep(1);
signal_value = pthread_kill(ptid1,SIGQUIT);
if(signal_value != 0)
{
printf("send signal to thread1 failed...\r\n");
}
signal_value = pthread_kill(ptid2,SIGQUIT);
if(signal_value != 0)
{
printf("send signal to thread2 failed...\r\n");
}
ret = pthread_join(ptid1,NULL);
if(ret != 0)
{
printf("pthread1 join failed...\r\n");
}
ret = pthread_join(ptid2,NULL);
if(ret != 0)
{
printf("pthread2 join failed...\r\n");
}
return 0;
}
Linux 스레드 간 통신을 위한 세마포어 (19)
링크: 링크 .(https://blog.csdn.net/qq_39721016/article/details/120604654?spm=1001.2014.3001.5501)