Подтвердить что ты не робот

Программа с циклом не будет завершена с помощью CTRL + C

У меня есть программа, которую я хочу запустить, пока не будет прервана пользователем нажатием CTRL + C. Когда я нажимаю на нее, ничего не происходит, и я могу только прекратить программу, приостановив ее и вручную убив после этого.

Это часть кода, который должен выполняться бесконечно:

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

Первая функция вычисляет, следует ли положить 1 или 0 в двумерном массиве, а вторая печатает ее с помощью цикла for следующим образом:

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");
}

Сон используется, поэтому есть достаточно времени, чтобы распечатать все на экране до его очистки.

Таким образом, программа не заканчивается на Ctrl+C. Что может вызвать это поведение и как завершить работу программы после Ctrl+C?

4b9b3361

Ответ 1

Я подозреваю, что код пользователя работает в течение некоторого небольшого промежутка времени, скажем, 1 мс, а процесс сна заставляет родительский процесс блокировать 100 мс, поэтому, если вы не очень упорны с клавишей CTRL + C, тогда прерывание, скорее всего, будет проигнорировано.

Вы должны просто заменить свой вызов на system("sleep .1") надлежащим вызовом библиотеки, например. изменить:

system("sleep .1");

в

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

Смотрите: man usleep.

Ответ 2

Из документации system() (выделение/выделение):

Функция библиотеки system() использует fork (2) для создания дочернего процесса   который выполняет команду оболочки, указанную в команде, используя execl (3)  следующим образом:

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

system() возвращается после завершения команды.

Во время выполнения команды SIGCHLD будет заблокирован, а SIGINT и SIGQUIT будут проигнорированы в процессе, который вызывает system() (эти сигналы будут обрабатываться в соответствии с их значениями по умолчанию внутри дочернего элемента процесс, который выполняет команду).

Это объясняет ваше поведение.

Ответ 3

Вы пробовали поймать сигнал? См. Примерный код ниже:

if (signal (SIGINT, yourFunctionHandler) == SIG_ERR)
    {
        cout << "Error setting the SIGINT handler";
    }

void yourFunctionHandler (int signal)
{
    cout << "Signal " << signal << " received!";
    //do what needed to kill loop
}

Таким образом вы можете изменить переменную цикла, как хотите. И, как предложили другие люди, не используйте system().

Ссылка на сигнал

Малый учебник