Posix señales en C

Posix señales en C

"Mientras conduce en la carretera, ¿qué haces cuando tienes un encuentro con una señal roja?? Dejas de conducir por un tiempo para esperar tu turno hasta que la señal se vuelva verde. Del mismo modo, cuando una señal tiene un color naranja, continúa conduciendo y nunca se detiene. Las señales de Posix funcionan lo mismo que la señal de tráfico funciona. La biblioteca de señales POSIX presentó una función muy simple que se utilizará en el código C para generar señales, hacer que sus programas esperen su ejecución y muchos más. Este artículo demostraría todas esas funciones de señal. Hemos estado comenzando nuestros ejemplos con la creación y la apertura de un archivo C."

Ejemplo 01

Dentro del primer ejemplo de señales Posix, vamos a demostrar el uso de una función de señal simple () para crear e invocar una señal. Por lo tanto, hemos estado usando la señal.H Biblioteca de C Para utilizar las funciones de la señal, el stdio.La biblioteca H se utiliza para las funciones de salida y entrada estándar y el UNISTD.h La biblioteca se utiliza para usar estructuras definidas por el usuario, i.mi., funciones. El código contiene una función de controlador simple llamada "Handle" con el argumento de tipo entero "S."Esta variable" S "funcionará como señal. Contiene una instrucción printf simple para enviar una señal "parar" al usuario.

La función Main () comienza creando una señal utilizando la función "señal" aquí mientras usa su opción "Sigint" para inicializar una señal y la función "manejar" para usar esta función como controlador de señal. El bucle "para" comienza desde "1", pero no tiene fin, yo.mi., Va a incrementar, pero nunca se detiene hasta que lo hagas tú mismo saliendo del programa. El bucle contiene una declaración printf de C para mostrar que actualmente estamos en la función Main (). Al utilizar el acceso directo Ctrl+C, podemos invocar la función Handle () para mostrar un mensaje de señal.

En cada iteración del bucle "para", duerme durante 5 segundos y luego se incrementa. Ejecutemos nuestro código C de señal C después de guardar y eliminar adecuadamente sus errores.

#incluir
#incluir
#incluir
mango vacío (int s)
printf ("\ nstop ... \ n");

int main ()
señal (Sigint, Many);
para (int i = 1 ;; i ++)
printf ("%d: main ... \ n", i);
dormir (5);
regresar 0;

Cuando ejecuta este programa con el compilador de "C" y lo ejecuta con el ".a/.Out ”consulta, verá una ejecución infinita del hilo principal ().

Cuando presionamos "Ctrl+C" para invocar la función del controlador de señal, la función Handle () se ejecuta y se muestra "parar" en este momento. Después de eso, el control nuevamente va al método main (), y nuevamente comienza a ejecutar su instrucción printf utilizando el bucle infinito "para". Presionamos la tecla de acceso directo "Ctrl+Z" para detener con fuerza este programa.

Digamos que desea ignorar la señal invocada por un usuario. Esto se puede hacer utilizando el parámetro Sig_ign de la función Signal () sin usar ninguna función de controlador. Estamos utilizando el mismo código con un ligero cambio en la función Signal (). Usando esta función, cuando un usuario invoca una señal usando el acceso directo "Ctrl+C", el programa ignorará la señal y continuará ejecutando el hilo de la función principal (). Simplemente guardemos y ejecutemos rápidamente este programa para ver la salida.

#incluir
#incluir
#incluir
int main ()
señal (Sigint, Sig_ign);
para (int i = 1 ;; i ++)
printf ("%d: ignorar la señal ... \ n", i);
dormir (5);
regresar 0;

Después de esta ejecución de código, la instrucción Main () Printf () continúa ejecutándose incluso después de usar el atajo "Ctrl+C". Entonces, detuvimos con fuerza el programa al final.

Ejemplo 02

Si desea elevar automáticamente una señal para su programa C sin usar la tecla Ctrl+C Acthcut, también puede hacerlo utilizando la función Raise () de la biblioteca de señales. Por lo tanto, hemos actualizado el código desde el primer ejemplo y agregamos una función de manejo () una vez más. La función Main () comienza con la creación de una señal utilizando la función Signal () pasando una opción "Sigusr1" con la función "Manejo" en los parámetros. Esta opción Sigussr1 es la clave para generar una señal automática. El bucle "para" duerme durante 10 segundos después de ejecutar la instrucción printf y luego llama a la función Raise () con la opción SigusR1 para generar una señal automática llamando a la función "Manejo". Eso es todo; Estamos listos para ejecutar este programa por ahora.

#incluir
#incluir
#incluir
mango vacío (int s)
printf ("\ nraise ... \ n");
dormir (5);

int main ()
señal (Sigusr1, mango);
para (int i = 1 ;; i ++)
printf ("%d: main ... \ n", i);
dormir (10);
elevar (Sigusr1);
regresar 0;

Después de la compilación exitosa, la ejecución tiene lugar. El hilo principal () GPT se ejecuta, y el programa duerme durante 10 segundos mientras está en el bucle.

Después de 10 segundos, la función de elevación se ha invocado para generar una señal automática llamando a la función de identificación. La ejecución duerme durante los siguientes 5 segundos en la función de identificación.

El control se devuelve a la función principal () "bucle", y este proceso continúa hasta que sale del programa de buena gana utilizando el atasco Ctrl+Z.

Al igual que su señal automática para su programa, también puede matar la señal después de que esté invocando y enviar la señal a un grupo de procesamiento. En otras palabras, la función de "matar" de la biblioteca de señales POSIX C se ha utilizado para enviar alertas al grupo del programa. Por lo tanto, hemos actualizado nuestro programa principal junto con su función de identificación en el código de imagen de arriba. El objeto PID_T se usa para crear una ID "P" para el proceso. La función Signal () se llama aquí para crear una señal mediante el uso de la función Handle () definida antes de la función principal.

La función getPID () se llama dentro del bucle "para" para obtener la ID de proceso de este hilo y guarda en una variable "P". Esta identificación del proceso "P" se pasa a la función de "matar" junto con la opción Sigusr1 para matar la señal y enviar su informe a un grupo de progreso. Luego, un programa duerme durante 8 segundos e imprime "de vuelta en Main" mientras continúa el bucle.

#incluir
#incluir
#incluir
mango vacío (int s)
printf ("\ nstop ... \ n");

int main ()
pid_t p;
señal (Sigusr1, mango);
para (int i = 1 ;; i ++)
printf ("%d: main ... \ n", i);
p = getpid ();
matar (P, Sigusr1);
dormir (8);
printf ("Back in Main \ n");
regresar 0;

La función se ejecuta, envía la señal al grupo de proceso y duerme durante 8 segundos.

El "Back in Main" se ejecutó, y el bucle continuó el mismo procesamiento.

Conclusión

Esta guía ha demostrado el uso de funciones de señal en el programa C para que su entorno de trabajo sea más eficiente. Para esto, hemos probado la función de señal () Posix (), Kill () y Rair () Function junto con las opciones Sigint, Sig_ign y Sigusr1 en las funciones.