1. El concepto básico de señal
Una señal es un evento generado por el sistema en respuesta a una determinada condición, y el proceso realizará la acción correspondiente al recibir la señal.
2. El método correspondiente para modificar la señal - señal ()
Utilice la señal () para modificar la señal especificada
Ignore la señal: SIG_IGN
Procesamiento predeterminado: SIG_DFL
Personalizado: función de procesamiento de señal escrita por usted mismo
Ejemplo 1:
Por ejemplo, el siguiente programa muestra que la señal SIGINT (la señal se genera cuando se presiona ctrl+c en el teclado) se modifica a un controlador divertido personalizado
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
void fun(int sign)
{
printf("fun was called, sign = %d\n", sign);
}
int main()
{
signal(SIGINT, fun);
while(1)
{
sleep(1);
printf("main running\n");
}
exit(0);
}
El programa se ejecuta de la siguiente manera:
3. Enviar una señal - matar()
kill() puede enviar la señal especificada al proceso especificado'
int kill(pid_t pid,int sig);
pid > 0 especifica a qué proceso enviar la señal
pid == 0 La señal se envía a un proceso en el mismo grupo de procesos que el proceso actual
pid == -1 envía la señal a todos los procesos en el sistema que tienen permiso para enviar
pid < -1 Envía la señal a todos los procesos cuyo ID de grupo de procesos es igual al valor absoluto de pid y tiene permiso para enviar.
sig especifica el tipo de señal enviada.
Ejemplo 2:
el siguiente código significa: ejecute este programa e ingrese el pid de un proceso, y use la señal de firma para procesar el proceso
#include <stdio.h>
#include <unistd.h>
#include <assert.h>
#include <signal.h>
int main(int argc, char* argv[])//pid, sig
{
if ( argc != 3 )
{
printf("argc error\n");
exit(0);
}
int pid = 0;
int sig = 0;
sscanf(argv[1],"%d",&pid);
sscanf(argv[2],"%d",&sig);
if ( kill(pid,sig) == -1 )
{
perror("kill error");
}
exit(0);
}
El programa se ejecuta de la siguiente manera:
consulte la identificación del proceso del ejemplo 1, luego ejecute el ejemplo 2, elimine el proceso 14851 (ejemplo 1) con la señal SIGKILL (#define SIGKILL 9)