打我写一个程序,反复做,直到按Ctrl + C的操作是通过在Linux终端的用户打。我在C编程。任何想法,我可以如何实现这一点。执行C程序,直至按Ctrl + C在终端
我以“为”测试我的程序与条件循环,但现在我希望把它只要按Ctrl + C被用户打和中断运行。
我在想什么是写一个做,而像下面
环做的{ /计算/ } 而(按Ctrl + C是打不到)
但我不知道如何检查用户的Ctrl + C输入。
任何建议将不胜感激。
感谢
打我写一个程序,反复做,直到按Ctrl + C的操作是通过在Linux终端的用户打。我在C编程。任何想法,我可以如何实现这一点。执行C程序,直至按Ctrl + C在终端
我以“为”测试我的程序与条件循环,但现在我希望把它只要按Ctrl + C被用户打和中断运行。
我在想什么是写一个做,而像下面
环做的{ /计算/ } 而(按Ctrl + C是打不到)
但我不知道如何检查用户的Ctrl + C输入。
任何建议将不胜感激。
感谢
的信号陷阱会做的伎俩更清洁比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);
/* ... */
}
按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);
/* ... */
}
如果在循环被破坏后预计执行将继续,则这将不起作用。 – You 2010-07-06 19:55:27
我尝试了你的建议,但由于某种原因程序进入了无限循环,并没有检测到我的Ctrl + C。 据我所知,该程序将简单地退出,但我想打印出一行后检测到一个Ctrl + C.Hence它应该只能离开这个循环,打印一条线,然后返回。 – 2010-07-06 20:05:44
感谢spudd86的详细回复。赞赏它 – 2010-07-07 18:06:36
当按Ctrl-C被击中,一个信号发送到程序。默认行为是程序被终止。
这意味着,你可以让你的程序运行永远不断地循环。当用户点击Ctrl-C时,程序将中止。
你只想让程序在CTRL + C上退出,还是想以编程方式捕捉CTRL + C并采取一些操作? – nos 2010-07-06 19:56:20
是的,我想在它检测到一个Ctrl + C然后返回后打印一行。基本上来自while循环并打印一行。 – 2010-07-06 20:07:35