2010-07-06 27 views
3

打我写一个程序,反复做,直到按Ctrl + C的操作是通过在Linux终端的用户打。我在C编程。任何想法,我可以如何实现这一点。执行C程序,直至按Ctrl + C在终端

我以“为”测试我的程序与条件循环,但现在我希望把它只要按Ctrl + C被用户打和中断运行。

我在想什么是写一个做,而像下面

环做的{ /计算/ } 而(按Ctrl + C是打不到)

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

任何建议将不胜感激。

感谢

+0

你只想让程序在CTRL + C上退出,还是想以编程方式捕捉CTRL + C并采取一些操作? – nos 2010-07-06 19:56:20

+0

是的,我想在它检测到一个Ctrl + C然后返回后打印一行。基本上来自while循环并打印一行。 – 2010-07-06 20:07:35

回答

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); 
    /* ... */ 
} 
+0

你能详细说明为什么这种方式更可取? – 2010-07-06 19:57:48

+1

如果您需要清理(空闲内存,保存设置,关闭文件句柄等),当用户中断无限循环时,它不会完成。这样,你可以在循环被破坏后自由地继续做事。这可能是一个简单的清理,或者是程序流程的延续。 – You 2010-07-06 20:01:54

+0

(想象一下,一个基于菜单的程序进行重计算;用户可以中止计算,并用这种方法你可以送他们回到菜单这是不可能的无限循环。) – You 2010-07-06 20:02:58

6

按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

如果在循环被破坏后预计执行将继续,则这将不起作用。 – You 2010-07-06 19:55:27

+0

我尝试了你的建议,但由于某种原因程序进入了无限循环,并没有检测到我的Ctrl + C。 据我所知,该程序将简单地退出,但我想打印出一行后检测到一个Ctrl + C.Hence它应该只能离开这个循环,打印一条线,然后返回。 – 2010-07-06 20:05:44

+0

感谢spudd86的详细回复。赞赏它 – 2010-07-07 18:06:36

0

当按Ctrl-C被击中,一个信号发送到程序。默认行为是程序被终止。

这意味着,你可以让你的程序运行永远不断地循环。当用户点击Ctrl-C时,程序将中止。