抓住CTRL- \信号

时间:2015-11-13 15:03:43

标签: c if-statement signals interrupt ctrl

我有一个用户定义的shell项目,我正在尝试实现cat命令,但允许用户单击CTRL-/以显示下一个x行。我是新手,所以我觉得我在某处有一些语法错误......

在主...

    while (fgets(buf, sizeof(buf), file) != NULL){ //CITE
        //print out first four lines
        if (j == 0){
          for (i = 0; i < 4; i++){
            printf("%s", buf);
            fgets(buf, sizeof(buf), file);
          }
          j++;
        }
        signal(SIGQUIT, sig_int);
        //now check for user input for the next x lines
        if (keepRunning){
          for (i = 0; i < 4; i++){
            printf("%s", buf);
            if (i < 3){
              if (fgets(buf, sizeof(buf), file) == NULL){
                fclose(file);
                return 0;
              }
            }
          }
          keepRunning = 0;
        }

然后我定义了以下sig_int函数...

static volatile int keepRunning = 0;
void sig_int(int sig){
  keepRunning = 1;
}

1 个答案:

答案 0 :(得分:0)

主要问题是,在没有收到信号时,您不会减速或停在任何地方。例如,您可以使用pause();它只在收到信号时返回。然后,您可以使用它代替if (keepRunning)块(包括条件)。

或者,您可以修改终端模式,以便在键入字符(“原始”模式)时发送字符,并在继续之前尝试读取字符。但是,如果您这样做,则有责任确保在程序退出之前尽可能多地重置终端模式。好消息是在原始模式下键盘不会产生任何信号,但您必须担心来自其他地方的信号。

您可能希望让其他信号唤醒程序并退出循环,但如果您没有为它们设置信号处理程序,那么这将自动发生。也就是说,在pause()返回后(它将始终以错误状态返回并且errno设置为EINTR),您可以检查keepRunning现在是否为1并且如果不是则退出循环。< / p>