Señales para comunicación entre subprocesos de Linux (18)

1. Señales de comunicación entre subprocesos de Linux.

En Linux, cada proceso tiene su propia máscara de señal, que especifica qué señal está bloqueada y cuál no, y generalmente se maneja llamando a sigmask. Al mismo tiempo, cada proceso también tiene su propia acción de señal. Este conjunto de comportamiento especifica cómo manejar la señal y generalmente llama a sigaction para manejarla.

2. Función de instalación de señal.

	int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

Función:
Especifique el número de señal para configurar la función de procesamiento de señal.

Parámetros:
signum: número de señal.
actuar: Puntero a una instancia de la estructura sigaction.
oldact: Se utiliza para guardar el procesamiento original de la señal, que puede ser NULL.

Valor de retorno:
Éxito: 0.
Fallo: -1.

3. Agregue todas las señales a la función de conjunto de señales.

	int sigfillset(sigset_t * set);

Función:
sigfillset () se utiliza para inicializar el conjunto de señales del conjunto de parámetros y luego agregar todas las señales a este conjunto de señales.

Parámetros:
conjunto: La dirección identificada por el conjunto de señales. Para operar este conjunto de señales en el futuro, simplemente opere en el conjunto.

Valor de retorno:
Éxito: 0.
Fallo: -1.

4. Agregue una señal a la función de configuración de señal.

	int sigaddset(sigset_t *set, int signum);

Función:
Añade una señal a este conjunto de señales.

Parámetros:
conjunto: La dirección identificada por el conjunto de señales. Para operar este conjunto de señales en el futuro, simplemente opere en el conjunto.
signum: número de señal.

Valor de retorno:
Éxito: 0.
Fallo: -1.

5.Inicializar la función de configuración de señal

	int sigemptyset(sigset_t *set);

Función:
Inicializar conjunto de señales.

Parámetros:
conjunto: La dirección identificada por el conjunto de señales. Para operar este conjunto de señales en el futuro, simplemente opere en el conjunto.

Valor de retorno:
Éxito: 0.
Fallo: -1.

6. Enviar función de señal al hilo

	int pthread_kill(thread_t tid, int sig);

Función:
Enviar señal al hilo.

Parámetros:
tid: ID del hilo.
sig: número de señal.

Valor de retorno:
Éxito: 0.
Fallo: -1.

7. Cambie o verifique la función de máscara de señal del hilo que llama

	int pthread_sigmask(int how, const sigset_t *act, sigset_t *oldact);

Función:
cambiar o verificar la máscara de señal del hilo de llamada.

Parámetros:
cómo: Agregar, eliminar o reemplazar el conjunto de la máscara de señal actual.
acto: palabra de protección de señal.
oldact: es NULL, está bien.

Cómo se describe:
SIG_BLOCK: el conjunto de resultados es la unión del conjunto de parámetros actual (agregue la señal en el conjunto de parámetros a la palabra de máscara de señal) SIG_UNBLOCK: el conjunto de resultados
es el conjunto de diferencias del conjunto de parámetros actual (establezca la señal palabra de máscara a la señal del conjunto de parámetros en el conjunto de parámetros)
SIG_SETMASK: el conjunto de resultados es el conjunto al que apunta el conjunto de parámetros (elimine la señal en el conjunto de parámetros de la palabra de máscara de señal)

Valor de retorno:
Éxito: 0.
Fallo: -1.

8. Código de referencia:

//=============================================================================
// 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;
}

Semáforo para comunicación entre subprocesos de Linux (19)

Enlace: enlace .(https://blog.csdn.net/qq_39721016/article/details/120604654?spm=1001.2014.3001.5501)

Supongo que te gusta

Origin blog.csdn.net/qq_39721016/article/details/120478269
Recomendado
Clasificación