带循环的程序不会以CTRL + C终止

hum*_*mra 35 c infinite

我有一个程序,我想运行,直到用户按下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) 如下:

   execl("/bin/sh", "sh", "-c", command, (char *) 0);
Run Code Online (Sandbox Code Playgroud)

system() 命令完成后返回.

在执行命令期间,SIGCHLD将被阻塞,并且在调用的过程中将忽略SIGINT和SIGQUITsystem()(这些信号将根据执行命令的子进程内的默认值进行处理).

这解释了你的行为.


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.