Desarrollo remoto de Linux: uso de señales (enlace y envío de señales)

contenido

1. El concepto de señal

2. La función de biblioteca signal()

Función tres, matar ()

1. Función

2. Prototipo de función

Cuarto, señales confiables y no confiables

V. Resumen


1. El concepto de señal

        Las señales son eventos generados por el sistema UNIX en respuesta a ciertas condiciones. El proceso tomará las acciones correspondientes al recibir señales. Las señales se generan debido a ciertas condiciones de error, como conflictos de segmentos de memoria, errores del procesador de punto flotante o instrucciones ilegales. . Son generados por shells y administradores de terminales para causar interrupciones. El propósito de una señal es avisarle que debe hacer algo. Por ejemplo, la alarma de la mañana le avisa que debe levantarse y la alarma actúa como una señal.

Puede ver todas las señales mediante kill -l en Linux

        Como se mencionó anteriormente, al eliminar el ID de proceso -9, se puede terminar el proceso al que pertenece el ID. Después de aprender el concepto de señal, puede entender este comando como el envío de la novena señal al proceso al que pertenece la ID, informándole que haga algo. La novena señal que se muestra en la figura anterior es SIGKILL, es decir, se envía una señal para detener el proceso al proceso al que pertenece la ID para notificarle que se detenga, que es el llamado proceso "kill".

        Los números del 1 al 31 son señales poco confiables y del 34 al 64 son señales confiables. Si la señal se envía de forma continua e ininterrumpida, la señal se perderá como una señal poco fiable , y si la señal se envía de forma continua e ininterrumpida, la señal no se perderá como una señal fiable .

2. La función de biblioteca signal()

        Si desea que el programa pueda manejar señales, puede usar la función de biblioteca de señales e importar el archivo de encabezado <signal.h>. Ingrese la señal de comando man en la terminal de Linux para ver su prototipo de función

        Se puede ver que el primer parámetro signum de la función signal() es el número de señal, es decir, todas las señales que se pueden consultar mediante kill -l, y el segundo parámetro sighhandler es un puntero de función.

        La señal a capturar o enmascarar viene dada por el parámetro signum, y la función a llamar cuando se recibe la señal especificada viene dada por sighhandler. La función sighandler debe tener un parámetro de tipo int ( es decir, el código de la señal recibida ), el tipo de función en sí es nulo y sighandler también puede tener los siguientes dos valores especiales: SIG_IGN (enmascarar la señal), SIG_DFL (restaurar el comportamiento predeterminado).

        En términos sencillos, la función de la biblioteca signal() es vincular una señal a una función . Cuando se envía la señal, hará el trabajo de la función vinculada. El mecanismo de señal y ranura de Qt se implementa tomando prestado este método.

Función tres, matar ()

1. Función

        La función de la función kill es enviar la señal dada por el parámetro sig al proceso cuyo número de identificación es pid. Si la señal está vinculada a una función a través de sinal(), el proceso se interrumpe temporalmente para realizar el negocio de la función vinculada. Una vez que se completa el negocio de la función, el proceso continúa ejecutándose.

        Para enviar una señal, el proceso emisor debe tener los permisos adecuados. Esto generalmente significa que ambos procesos deben tener el mismo ID de usuario.

2. Prototipo de función

int matar(pid_t pid, int sig);

parámetro:

pid: identificación del proceso

sig: una señal

valor de retorno:

Devuelve 0 en caso de éxito y -1 en caso de error.

Cuarto, señales confiables y no confiables

Usemos un fragmento de código para verificar señales confiables y no confiables

#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

using namespace std;

void signalfunction(int i);

int main()
{
	int pid = 0;
	int status = 0;
	//将信号和函数绑定在一起
	signal(SIGUSR1, signalfunction);
	pid = fork();
	if (pid == 0)//子进程
	{
		while(1)
		{
			cout << "子进程运行中 pid = " << getpid() << endl;
			sleep(1);
		}
	}
	else if(pid > 0)//父进程
	{
		sleep(3);//先让子进程先处理业务,测试kill函数
		for (int i = 1; i <= 5; i++)
		{
			cout << "父进程给子进程发送第 " << i << " 个信号" << endl;
			kill(pid, SIGUSR1);//给子进程发送信号
		}
		sleep(3);//延时3秒
		kill(pid, SIGKILL);//给子进程发送停止信号
		waitpid(pid, &status, 0);//等待子进程结束,防止子进程托孤
		cout << "子进程结束" << endl;
	}
	return 0;
}

void signalfunction(int i)
{
	cout << "函数被调用了 i = " << i << endl;
}

        La señal número 10 (SIGUSR1) y la señal número 12 (SIGUSR2) son señales de usuario que el programador puede usar y ambas señales no son confiables.

En el código anterior, el proceso principal envía una señal (SIGUSR1) 5 veces         a través de un bucle for , y la señal (SIGUSR1) está vinculada por las funciones de señal (SIGUSR1, función de señal) y función de señal (), es decir, envía un Signal una vez llamará a esta función de función de señal () una vez. La salida de la consola es la siguiente:

        Se puede encontrar que el proceso padre envía la señal 5 veces, pero la función enlazada se ejecuta solo una vez, es decir, ocurre el fenómeno de pérdida de señal, lo que confirma que la señal se envía de forma continua e ininterrumpida, y la señal se perderá . como una señal no confiable , numeradas del 1 al 31 son señales no confiables. Al mismo tiempo, se puede encontrar que el valor de tipo int impreso por la función llamada es exactamente el número 10 de la señal no confiable ( SIGUSR1 ) .

        Si cambias la señal ( SIGUSR1 , función de señal) a la señal ( SIGRTMIN , función de señal) y envías la señal matar (pid, SIGUSR1 ) a matar (pid, SIGRTMIN ) para continuar la prueba, la salida de la consola es la siguiente:

        Se puede encontrar que el proceso principal envía la señal 5 veces, y la función vinculada también se ejecuta 5 veces, es decir, la señal no se pierde, lo que confirma que la señal se envía de forma continua e ininterrumpida, y la señal no será perdido La señal confiable está numerada 34-64 son señales confiables. El valor de tipo int impreso por la función llamada también pasa a ser el número 34 de esa señal confiable ( SIGRTMIN ) .

V. Resumen

1. La función signal() puede vincular una señal a una función.

2. La función kill () puede enviar una señal a un proceso secundario con una determinada ID, interrumpir temporalmente el proceso secundario y volver a procesar la función vinculada por la señal a través de la función signal ().

3. Las numeradas del 1 al 31 son todas señales no confiables, y las numeradas del 34 al 64 son todas señales confiables . La señal no confiable perderá la señal cuando la señal se envíe de forma continua e ininterrumpida, pero la señal confiable no tendrá este fenómeno.

La originalidad no es fácil, por favor indique la fuente al reimprimir.

Si es útil para usted, puede darle me gusta, recopilar + seguir, y se actualizará continuamente (je, je).

Supongo que te gusta

Origin blog.csdn.net/wmcy123/article/details/123587709
Recomendado
Clasificación