Este programa solo se puede realizar señales de UNIX, pero… ¿Qué son las señales UNIX? Aun peor… ¿Qué es UNIX?
Podríamos decir que UNIX es una familia de sistemas operativos que cuenta con varias distribuciones. Fue especialmente popular en las últimas décadas del siglo pasado. Con el tiempo, surgieron sistemas operativos como el desarrollado por Apple (macOS) que se basaban en UNIX, y surgieron también otros sistemas operativos (como LINUX) que tenían un desarrollo muy similar a UNIX.
Por tanto, aunque a día de hoy los sistemas puramente UNIX no sean los más usados, muchos sistemas operativos de hoy día nacen de UNIX y por ello a día de hoy podemos seguir hablando de signal UNIX en contextos de macOS y/o Ubuntu u otras distribuciones de Linux.
Para hablar de señales de UNIX podemos poner un par de ejemplos de sobra conocidos: SIGSEGV (Segmentation Fault) y SIGBUS. Toda persona que ha programado en C se ha encontrado alguna vez con ese tipo de error, por ejemplo cuando intentamos acceder a lugares de la memoria que están más allá de la memoria asignada a nuestro programa. SIGSEGV y SIGBUS son dos ejemplos de señales UNIX: cortan el programa directamente, sin mayor posibilidad de discusión y sin demasiadas explicaciones.
Las señales UNIX son un mecanismo de comunicación entre el sistema operativo y los procesos, o entre los propios procesos. Son eventos asíncronos que se envían a un proceso para notificarle de algún evento o condición particular.
Con procesos podemos referirnos aquí a programas, diremos que si por ejemplo tenemos abiertos un editor de texto y un reproductor de música, serían dos procesos distintos, cada uno con su propio espacio asignado en memoria, con sus propios recursos. Es decir, un proceso no es un programa en el disco duro sin más, sino que un proceso se da cuando un programa está ejecutándose, ocupando espacio en la RAM.
Y las señales UNIX son un mecanismo que permite al sistema operativo comunicarse con los procesos, y también permite que los procesos se comuniquen entre sí.
Se dice que son asincrónicas porque pueden ocurrir en cualquier momento, independientemente de en qué punto esté el proceso: puede que el proceso esté a la espera de la identificación del usuario, puede que esté ejecutándose con aparente normalidad, etc. Las señales pueden darse en cualquier momento, lo que las convierte en muy eficientes para la comunicación. Por supuesto, que sean asincrónicas no quiere decir que se den de manera aleatoria: las señales se dan cuando tienen que darse (por ejemplo, cuando surge un error), no aparecen de la nada, pero el hecho de que puedan aparecer en cualquier momento las convierte en muy efectivas.
El sistema operativo de tipo UNIX se encarga de que el proceso que recibe la señal la trate inmediatamente. Esa es otra característica de las señales: son atendidas de inmediato. Tan de inmediato que, cuando una señal UNIX es recibida, el proceso termina la línea de código en la que está ejecutándose, ejecuta la función de tratamiento de señales adecuada e inmediatamente después continúa con la siguiente línea de código (siempre y cuando la señal atendida no suponga el fin del programa). Es decir, una señal puede suponer simplemente un aviso o una acción dentro de la ejecución del programa. Un aviso o acción en mitad del desarrollo de la ejecución del programa. O también puede suponer el fin de este programa.
Con la mayoría de señales caben tres posibilidades:
Estas tres posibilidades caben para todas las señales excepto para SIGNKILL y SIGNSTOP, que simplemente harán lo que por defecto se espera de ellas: terminar el proceso (SIGNKILL) y ponerse en pausa (SIGNSTOP) sin posibilidad de ignorar o manejar estas señales.