用循环编程不会以CTRL + C结束

我有一个程序,我想运行,直到用户按CTRL + C中断。当我按下它什么都没有发生,我只能通过暂停它,然后手动杀死它,终止程序。

这是需要无限运行的代码的一部分:

while(true) { liveOrDie(field); printOut(field); } 

第一个函数计算是将1还是0放在二维数组中,第二个函数使用for循环打印出来,如下所示:

 void printOut(int field[38][102]) { for(int i = 0; i < 38; i++) { for(int j = 0; j < 102; j++) { if(field[i][j] == 1) { cout << "o"; } else { cout << " "; } } cout << endl; } system("sleep .1"); } 

睡眠被使用,所以在清除之前有足够的时间在屏幕上打印所有的东西。

所以,程序不会以Ctrl+C结束。 什么可能导致这种行为,以及如何使程序在Ctrl+C之后终止?

我怀疑用户代码运行了一段时间,比如说1毫秒,睡眠过程导致父进程阻塞了100毫秒,所以除非你持续使用CTRL + C键,那么中断将会最可能会被忽略。

您应该用正确的库调用将您的调用replace为system("sleep .1") ,例如更改:

 system("sleep .1"); 

至:

 usleep(100000); // NB: requires #include <unistd.h> 

看: 男人睡了 。

system()的文档 system() (重点/粗体):

system()库函数使用fork(2)创build一个subprocess,该subprocess使用execl(3)执行在命令中指定的shell命令,如下所示:

  execl("/bin/sh", "sh", "-c", command, (char *) 0); 

system()在命令完成后返回。

在执行该命令的过程中,SIGCHLD将被阻塞,在调用system()的过程中,SIGINT和SIGQUIT将被忽略 (这些信号将根据执行命令的subprocess中的默认值进行处理)。

这解释了你的行为。

你有没有尝试捕捉信号? 请参阅下面的示例代码:

 if (signal (SIGINT, yourFunctionHandler) == SIG_ERR) { cout << "Error setting the SIGINT handler"; } void yourFunctionHandler (int signal) { cout << "Signal " << signal << " received!"; //do what's needed to kill loop } 

通过这种方式,您可以根据需要修改循环variables。 和其他人一样,不要使用system()

信号参考

小教程