我有一个程序,我想运行,直到用户按下CTRL + C中断.当我按下它没有任何反应,我只能通过暂停它并在此之后手动终止它来终止程序.
这是需要无限运行的代码的一部分:
while(true) {
liveOrDie(field);
printOut(field);
}
Run Code Online (Sandbox Code Playgroud)
第一个函数计算是将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");
}
Run Code Online (Sandbox Code Playgroud)
使用睡眠,因此有足够的时间在屏幕上清除所有内容.
所以,程序不会终止Ctrl+C
.什么可能导致这种行为,以及如何使程序终止后Ctrl+C
?
web*_*ter 85
从文档中system()
(重/加粗我的):
的
system()
库函数使用叉(2) ,以创建子进程执行使用在命令中指定的外壳命令execl的(3) 如下:Run Code Online (Sandbox Code Playgroud)execl("/bin/sh", "sh", "-c", command, (char *) 0);
system()
命令完成后返回.在执行命令期间,SIGCHLD将被阻塞,并且在调用的过程中将忽略SIGINT和SIGQUIT
system()
(这些信号将根据执行命令的子进程内的默认值进行处理).
这解释了你的行为.
Pau*_*l R 61
我怀疑用户代码运行了一段时间,比如1毫秒,睡眠过程导致父进程阻塞100毫秒,所以除非你对CTRL + C密钥非常持久,否则中断很可能会被忽略.
您应该system("sleep .1")
用适当的库调用替换您的调用,例如更改:
system("sleep .1");
Run Code Online (Sandbox Code Playgroud)
至:
usleep(100000); // NB: requires #include <unistd.h>
Run Code Online (Sandbox Code Playgroud)
见:man usleep.