带有循环的程序不会以CTRL+;C

带有循环的程序不会以CTRL+;C,c,infinite,C,Infinite,我有一个程序,我想运行,直到用户按CTRL+C中断。当我按下它时,什么也不会发生,我只能通过挂起它并手动终止它来终止程序 这是代码中需要无限运行的部分: while(true) { liveOrDie(field); printOut(field); } 第一个函数计算是将1还是0放入二维数组,第二个函数使用for循环将其打印出来,如下所示: void printOut(int field[38][102]) { for(int i = 0; i < 38; i++) {

我有一个程序,我想运行,直到用户按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");
}
void打印输出(int字段[38][102]){
对于(int i=0;i<38;i++){
对于(int j=0;j<102;j++){
如果(字段[i][j]==1){

cout我怀疑用户代码会运行一小段时间,比如说1毫秒,而睡眠进程会导致父进程阻塞100毫秒,因此除非您非常持久地使用CTRL+C键,否则中断很可能会被忽略

您只需将对
系统(“sleep.1”)
的调用替换为正确的库调用,例如更改:

system("sleep .1");
致:

usleep(100000);//NB:requires#include
请参见:.

来自
系统()
(强调/粗体):

system()
库函数用于创建子进程 使用执行命令中指定的shell命令的 详情如下:

   execl("/bin/sh", "sh", "-c", command, (char *) 0);
system()
在命令完成后返回

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


这解释了您的行为。

您是否尝试捕捉信号?请参见下面的示例代码:

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
}
if(信号(SIGINT,yourFunctionHandler)=SIG\u ERR)
{

不能尝试使用CTRL+Z组合键终止。您可能正在终止对
睡眠的
系统调用,而不是您自己的代码-使用适当的库调用来进行睡眠,而不是退出,例如
睡眠(1)
。这是人生游戏吗?是的,这是人生游戏。问题是,
系统
很可能会覆盖您的信号处理程序(无论是默认的还是您自己的)。这就是为什么我添加了don't use system():-)我认为命令
usleep(1000)
也可以在humans v2.0及以上+1上工作,以提供实际的文档。另外,请不要使用die.net,它已经过时。更新的文档。
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
}