Programación en C

Señales POSIX con programación en C

Señales POSIX con programación en C
Podemos definir una señal como una actividad que se activa para alertar a una operación o hilo cada vez que llega el momento de la llegada de una determinada situación significativa. Siempre que un procedimiento o subproceso reconoce una señal, el procedimiento o subproceso detendrá lo que esté haciendo y tomará una acción inmediata. En la coordinación entre procesos, la señal puede ser eficaz. En esta guía, estudiará los controladores de señales en Linux a través del lenguaje C.

Señales estándar o regulares:

La señal del archivo de encabezado.h 'tiene señales especificadas en él como una macro constante. El título de la señal comienza con "SIG" y está precedido por una breve descripción general de la señal. En consecuencia, cualquier señal tiene un valor numérico distinto. El código del programa debe usar el nombre de la señal, no varias señales. La causa detrás de esto es que la cantidad de señales puede variar según el sistema, pero la interpretación de los nombres es estándar. A continuación se muestran algunas señales regulares con su funcionalidad definida.

SIGHUP:

Esta señal colgará el procesamiento. La señal SIGHUP se está emitiendo para indicar la disociación del terminal del usuario, probablemente debido a que una comunicación remota se interrumpe o se cuelga.

SIGNO:

Interrumpirá el proceso. La señal SIGINT se recibe siempre que el usuario ingresa la tecla INTR (generalmente Ctrl + C).

SIGQUIT:

Se detendrá o saldrá del procesamiento. La señal SIGQUIT se recibe cada vez que el usuario ingresa la tecla QUIT (generalmente Ctrl + \).

SIGILL:

Se ejecuta cuando se ha realizado un comando ilícito. La señal SIGILL se crea cada vez que se hace un esfuerzo para ejecutar un comando no deseado o privilegiado. Siempre que la pila se desborde y la máquina tenga problemas para ejecutar un controlador de señal, también se puede crear SIGILL.

SIGTRAP:

Se llama cuando se está ejecutando alguna instrucción de trampa de seguimiento. La señal SIGTRAP se crea mediante un comando de punto de interrupción y otro comando de captura. El depurador usa tal señal.

SIGABRT:

Se llama señal de aborto. La señal SIGABRT se crea llamando al método abort (). Dicha señal se usa para señalar la inexactitud observada por el código mencionado anteriormente y registrada por la llamada al método abort ().

SIGFPE:

Excepción para puntos flotantes; La señal SIGFPE se produce cuando se produce un error matemático catastrófico.

SIGUSR1 y SIGUSR2:

Las señales SIGUSR1 y SIGUSR2 se pueden utilizar de la forma que desee. Es beneficioso para una fácil interacción entre procesos crear un manejador de señales para tales señales en la aplicación que recibe la señal.

Comportamiento predeterminado de las señales:

Hay un comportamiento o acción estándar para cada señal, y es posible ajustar el comportamiento predeterminado utilizando la función del controlador. El comportamiento automático de la señal SIGKILL y SIGABRT no se pudo modificar ni ignorar.

Término: Terminará la operación.

Centro: Se generará un documento de volcado de memoria y se terminará la operación.

Ign: El proceso pasaría por alto una señal.

Detener: Detendrá la operación.

Cont: La operación se mantendrá desde que se detenga.

Manejo de señales:

El proceso tiene una preferencia de comportamiento por una señal cuando se reconoce. El proceso puede comportarse de la siguiente manera:

La señal se descarta automáticamente cuando se pasa por alto el comportamiento definido de la señal.

Usando métodos como signal o sigaction, el código puede registrar una función de controlador. Se llama captar una señal de un manejador.

Si una señal no está siendo tratada o descuidada, puede ocurrir la acción estándar.

Puede definir la función de manejo de señales como:

$ Int señal () int signum, void (* funk) (int))

Cuando el procesamiento obtiene un signum de señal, el método signal () puede llamar al método 'func'. Signal () revierte un puntero al método 'func' si es próspero o si se devuelve una excepción a errno y -1 en su lugar.

El puntero 'func' puede tener tres valores:

SIG_DFL: Este es un puntero al método estándar SIG DFL (), definido en el encabezado.h documento utilizado para obtener el comportamiento estándar de la señal.

SIG_IGN: Esta es una referencia al método de ignorar SIG IGN (), especificado en el encabezado.h documento.

Puntero de método de controlador definido por el usuario: El tipo de método de controlador definido por el usuario void (*) (int), implica que la categoría de retorno es nula y que el argumento solitario es int.

Crear una nueva señal de archivo.c 'y escriba a continuación el código del controlador de señales en él.

Vincular la señal.archivo c con gcc.

Mientras ejecuta la señal.c, tenemos un bucle sin fin que se lleva a cabo en el método principal. Al presionar CTRL + C, inició el método del controlador y la ejecución del método principal se detuvo. El procesamiento del método principal continuó después de la realización del método del controlador. Al presionar Ctrl + \, la operación se cierra.

Ignorar señal:

Para pasar por alto la señal, cree una señal de archivo.c 'y escribe debajo del código.

Atar el ignorar.archivo c con gcc.

Ejecuta la señal.archivo c. Toque CTRL + C, se crea la señal SIGNIT; sin embargo, el comportamiento pasa desapercibido porque el método del controlador se enumera en el método SIG_IGN ().

Vuelva a registrar el manejador de señales:

Para volver a registrar el manejador de señales, cree un nuevo archivo 'rereg.c 'e inscriba el siguiente código en él:

Asociar el rereg.archivo c con gcc.

Ejecuta el rereg.archivo c. Al presionar CTRL + C por primera vez, el método del controlador aumentó, y el controlador de señal se volvió a registrar en SIG_DFL. Al presionar CTRL + C nuevamente, la ejecución se terminó.

Enviar señales usando Raise ():

Crear un archivo 'enviar.c 'y agregue el siguiente código. Para enviar señales al método de llamada, se usa el método raise ().

Relacionar el envío.archivo c con gcc.

El proceso utiliza el método raise () para transmitir la señal SIGUSR1 por sí solo.

Enviar señales usando Kill ():

Agregue el siguiente código en 'raise.C'. Utilice el método kill () para enviar señales al grupo de procesos.

Vincular el aumento.archivo c con gcc.

Al usar el método kill (), el proceso dirige la señal SIGUSR1 al mencionado.

Interacción padre-hijo:

Para ver la interacción entre padres e hijos, escriba el siguiente código en un archivo.

Vincular el comunicador.archivo c con gcc.

Fork () / método genera hijo, revierte cero al proceso hijo y la identificación del hijo al padre.

Conclusión:

En esta guía, hemos visto cómo crear, manejar, enviar, ignorar, volver a registrar y usar la señal para la interacción entre procesos en Linux.

Cómo cambiar el tamaño, el color y el esquema del puntero del mouse y del cursor en Windows 10
El puntero y el cursor del mouse en Windows 10 son aspectos muy importantes del sistema operativo. Esto también se puede decir de otros sistemas opera...
Motores de juegos gratuitos y de código abierto para desarrollar juegos de Linux
Este artículo cubrirá una lista de motores de juegos de código abierto y gratuitos que se pueden usar para desarrollar juegos 2D y 3D en Linux. Existe...
Tutorial de Shadow of the Tomb Raider para Linux
Shadow of the Tomb Raider es la duodécima incorporación a la serie Tomb Raider, una franquicia de juegos de acción y aventuras creada por Eidos Montre...