执行C程序直到Ctrl + C命中终端

The*_*tig 3 c linux terminal

我正在编写一个程序,它反复执行操作,直到Linux终端中的用户点击Ctrl + C. 我在C编程.任何想法如何实现这一点.

我已经通过使用带有条件的"for"循环测试了我的程序,但现在我想让它运行只要用户点击Ctrl + C并中断.

我在想的是编写一个do while循环,如下所示

执行{/ Computation /} while(Ctrl + C未命中)

但我不知道如何检查用户的Ctrl + C输入.

任何建议将不胜感激.

谢谢

You*_*You 12

信号陷阱比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);
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

  • 这段代码坏了; 一个好的编译器会将该循环优化为`while(1)`.你需要至少将`execute`声明为`volatile`,你应该使用`sig_atomic_t`. (2认同)

Spu*_*d86 6

Ctrl + C将向您的程序发送一个信号(SIGINT),如果您没有设置处理程序,它将导致您的程序退出.所以你要做的就是写作

do { 
  //computation
} while(1);
Run Code Online (Sandbox Code Playgroud)

这将做你想要的

编辑:要做你真正想要的而不需要信号处理程序,并避免做可能导致编译器优化破坏你的代码的事情,你可以这样做:

#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);
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)