Выполнять программу на C, пока Ctrl + C не нажмет в терминале - PullRequest
3 голосов
/ 06 июля 2010

Я пишу программу, которая многократно выполняет операцию, пока пользователь не нажмет Ctrl + C в терминале Linux.Я программирую на C. Любые идеи, как я могу это реализовать.

Я проверил свою программу, используя циклы "for" с условием, но теперь я хочу, чтобы она работала, пока нажаты Ctrl + Cпользователем и прервано.

Я думал о написании цикла do while, подобного следующему

do {/ Вычисление /} while (Ctrl + C - этоне ударил)

Но я не знаю, как проверить ввод Ctrl + C от пользователя.

Любые предложения будут оценены.

Спасибо

Ответы [ 3 ]

12 голосов
/ 06 июля 2010

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

#include <signal.h>
/* ... */

int execute;
void trap(int signal){ execute = 0; }

int main() {
    /* ... */
    signal(SIGINT, &trap);
    execute = 1;
    while(execute){
        /* ... */
    }
    signal(SIGINT, SIG_DFL);
    /* ... */
}
6 голосов
/ 06 июля 2010

Ctrl + C отправит вашей программе сигнал (SIGINT), если вы НЕ настроите обработчик, это приведет к выходу вашей программы. Так что все, что вам нужно сделать, это написать

do { 
  //computation
} while(1);

и это будет делать то, что вы хотите

РЕДАКТИРОВАТЬ: Чтобы сделать то, что вы ДЕЙСТВИТЕЛЬНО хотели, не нуждаясь в обработчике сигналов и избегая действий, которые могут привести к оптимизации компилятора, нарушающей ваш код, вы можете сделать это:

#include <signal.h>
/* ... */

int main() {
    sigset_t set, oldset;

    sigemptyset(&set);

    /* ... */

    sigaddset(&set, SIGINT);
    sigprocmask(SIG_BLOCK, &set, &oldset);
    do {
        sigset_t pending_set;
        /* ... */
        sigpending(&pending_set);
    } while(!sigismember(&pending_set, SIGINT));
    sigprocmask(SIG_SETMASK, &oldset, NULL);
    /* ... */
}
0 голосов
/ 06 июля 2010

При нажатии Ctrl-C в программу посылается сигнал .Поведение по умолчанию заключается в том, что программа завершается.

Это означает, что вы можете позволить вашей программе работать вечно, бесконечно зацикливаясь.Когда пользователь нажимает Ctrl-C, программа прерывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...