首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行C程序,直到Ctrl+C命中终端

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

Stack Overflow用户
提问于 2010-07-06 19:48:15
回答 3查看 4.7K关注 0票数 4

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

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

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

同时执行{/计算/}(Ctrl+C未命中)

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

如有任何建议,将不胜感激。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-06 19:54:39

信号诱捕器将比开球86的建议更清晰地发挥作用。不过,这个例子可以大大改进。

代码语言:javascript
复制
#include <signal.h>
/* ... */

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

int main() {
    /* ... */
    signal(SIGINT, &trap);
    execute = 1;
    while(execute){
        /* ... */
    }
    signal(SIGINT, SIG_DFL);
    /* ... */
}
票数 13
EN

Stack Overflow用户

发布于 2010-07-06 19:50:37

Ctrl+C将向您的程序发送信号(SIGINT),如果您不为此设置处理程序,则会导致程序退出。所以你要做的就是写

代码语言:javascript
复制
do { 
  //computation
} while(1);

你想做什么就做什么

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

代码语言:javascript
复制
#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);
    /* ... */
}
票数 7
EN

Stack Overflow用户

发布于 2010-07-06 19:51:44

当Ctrl被击中时,会向程序发送一个信号.默认行为是终止程序。

这意味着您可以让您的程序永远运行,无休止地循环。当用户点击Ctrl时,程序将中止.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3189650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档