c infinite

El programa con ciclo no terminará con CTRL+C



infinite (3)

Tengo un programa que quiero ejecutar hasta que el usuario lo interrumpa presionando CTRL + C. Cuando lo presiono, no pasa nada y solo puedo finalizar el programa suspendiéndolo y matándolo manualmente después de eso.

Esta es la parte del código que debe ejecutarse infinitamente:

while(true) { liveOrDie(field); printOut(field); }

La primera función calcula si se coloca 1 o 0 en una matriz bidimensional y la segunda se imprime utilizando un ciclo for como este:

void printOut(int field[38][102]) { for(int i = 0; i < 38; i++) { for(int j = 0; j < 102; j++) { if(field[i][j] == 1) { cout << "o"; } else { cout << " "; } } cout << endl; } system("sleep .1"); }

El modo de suspensión se usa para que haya suficiente tiempo para imprimir todo en la pantalla antes de borrarlo.

Entonces, el programa no termina con Ctrl+C ¿Qué puede causar este comportamiento y cómo hacer que el programa finalice después de Ctrl+C ?


¿Has intentado captar la señal? Vea el siguiente código de ejemplo:

if (signal (SIGINT, yourFunctionHandler) == SIG_ERR) { cout << "Error setting the SIGINT handler"; } void yourFunctionHandler (int signal) { cout << "Signal " << signal << " received!"; //do what''s needed to kill loop }

De esta forma, puede modificar la variable de bucle como lo desee. Y como otras personas sugirieron, no use el sistema () .

Referencia de señal

Pequeño tutorial


De la documentation del system() (énfasis / bold mine):

La función de biblioteca del system() usa fork(2) para crear un proceso hijo que ejecuta el comando del shell especificado en el comando utilizando execl(3) siguiente manera:

execl("/bin/sh", "sh", "-c", command, (char *) 0);

system() regresa después de que el comando ha sido completado.

Durante la ejecución del comando, SIGCHLD será bloqueado, y SIGINT y SIGQUIT serán ignorados, en el proceso que llama al system() (estas señales serán manejadas de acuerdo con sus valores predeterminados dentro del proceso hijo que ejecuta el comando ).

Lo cual explica tu comportamiento.


Sospecho que el código de usuario se ejecuta durante un período de tiempo pequeño, digamos 1 ms, y el proceso de suspensión hace que el proceso principal se bloquee durante 100 ms, así que a menos que sea muy persistente con la tecla CTRL + C , la interrupción probablemente sea ignorado

Debería simplemente reemplazar su llamada al system("sleep .1") con una llamada apropiada a la biblioteca, por ejemplo, cambiar:

system("sleep .1");

a:

usleep(100000); // NB: requires #include <unistd.h>

Ver: el hombre dormido .