用循环编程不会以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() 。
信号参考
小教程