process – ¿Qué provoca que se envíen varias señales?

Pregunta:

A veces me confunden un poco todas las señales que puede recibir un proceso. Según tengo entendido, un proceso tiene un controlador predeterminado ( disposición de señal ) para cada una de estas señales, pero puede proporcionar su propio controlador llamando a sigaction() .

Entonces, aquí está mi pregunta: ¿qué causa que se envíen cada una de las señales? Me doy cuenta de que puede enviar señales manualmente a los procesos en ejecución a través del parámetro -s para kill , pero ¿cuáles son las circunstancias naturales bajo las cuales se envían estas señales? Por ejemplo, ¿cuándo se envía SIGINT ?

Además, ¿existen restricciones sobre qué señales se pueden manejar? ¿Se pueden procesar incluso las señales SIGSEGV y devolver el control a la aplicación?

Respuesta:

Además de los procesos que llaman a kill(2) , el kernel (o, a veces, el propio proceso) envía algunas señales en diversas circunstancias:

  • Los controladores de terminal envían señales correspondientes a varios eventos:
    • Notificaciones de pulsación de teclas: SIGINT (vuelva al bucle principal) en Ctrl + C , SIGQUIT (salga de inmediato) en Ctrl + \ , SIGTSTP (suspenda) en Ctrl + Z. Las claves se pueden cambiar con el comando stty .
    • SIGTTIN y SIGTTOU se envían cuando un proceso en segundo plano intenta leer o escribir en su terminal de control.
    • SIGWINCH se envía para señalar que el tamaño de la ventana del terminal ha cambiado.
    • SIGHUP se envía a la señal de que el terminal ha desaparecido (históricamente debido a su módem tuvo h hasta ung, hoy en día por lo general porque se ha cerrado la ventana de emulación de terminal).
  • Algunas trampas de procesador pueden generar una señal. Los detalles dependen de la arquitectura y el sistema; aquí hay ejemplos típicos:
    • SIGBUS para una memoria de acceso no alineada;
    • SIGSEGV para acceder a una página no mapeada;
    • SIGILL para una instrucción ilegal (código de operación incorrecto);
    • SIGFPE para una instrucción de punto flotante con malos argumentos (por ejemplo, sqrt(-1) ).
  • Varias señales notifican al proceso de destino que ha ocurrido algún evento del sistema:
    • SIGALRM notifica que un temporizador establecido por el proceso ha expirado. Los temporizadores se pueden configurar con alarm , setitimer y otros.
    • SIGCHLD notifica a un proceso que uno de sus hijos ha fallecido.
    • SIGPIPE se genera cuando un proceso intenta escribir en una tubería cuando el extremo de lectura se ha cerrado (la idea es que si ejecuta foo | bar y bar exits, foo es asesinado por un SIGPIPE ).
    • SIGPOLL (también llamado SIGIO ) notifica al proceso que ha ocurrido un evento sondeable. POSIX especifica los eventos sondeables registrados a través de I_SETSIG ioctl . Muchos sistemas permiten eventos de sondeo en cualquier descriptor de archivo, establecido mediante el O_ASYNC fcntl . Una señal relacionada es SIGURG , que notifica datos urgentes en un dispositivo (registrado a través de I_SETSIG ioctl ) o enchufe .
    • En algunos sistemas, SIGPWR se envía a todos los procesos cuando el UPS indica que un SIGPWR energía es inminente.

Estas listas no son exhaustivas. Las señales estándar se definen en signal.h .

La aplicación puede captar y manejar (o ignorar) la mayoría de las señales. Las únicas dos señales portátiles que no se pueden captar son SIGKILL (simplemente muere) y STOP (detener la ejecución).

SIGSEGV ( error de segmentación ) y su primo SIGBUS ( error de bus ) pueden detectarse, pero es una mala idea a menos que sepa realmente lo que está haciendo. Una aplicación común para detectarlos es imprimir un seguimiento de pila u otra información de depuración. Una aplicación más avanzada es implementar algún tipo de administración de memoria en proceso o capturar malas instrucciones en motores de máquinas virtuales.

Finalmente, permítanme mencionar algo que no es una señal. Cuando presiona Ctrl + D al comienzo de una línea en un programa que está leyendo la entrada del terminal, esto le dice al programa que se alcanzó el final del archivo de entrada. Esta no es una señal: se transmite a través de la API de entrada / salida. Al igual que Ctrl + C y amigos, la tecla se puede configurar con stty .

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım