繁体   English   中英

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

[英]Program with loop will not terminate with 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后终止?

system() 文档 system() (强调/大胆矿):

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

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

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

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

这解释了你的行为。

我怀疑用户代码运行了一段时间,比如1毫秒,睡眠过程导致父进程阻塞100毫秒,所以除非你对CTRL + C密钥非常持久,否则中断最多可能会被忽略。

您应该用适当的库调用替换您对system("sleep .1")的调用system("sleep .1") ,例如更改:

system("sleep .1");

至:

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

见: man usleep

你试过捕捉信号了吗? 请参阅下面的示例代码:

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
}

通过这种方式,您可以根据需要修改循环变量。 正如其他人建议的那样,不要使用system()

信号参考

小教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM