编写我自己的shell - 正确处理ctrl + c(SIGINT)的麻烦

时间:2016-03-30 20:45:08

标签: c linux bash shell signal-handling

我正在编写自己的简单shell。我需要做的一件事是通过保留在shell中来控制SIGINT信号,并在按下ctrl + c时将提示打印在一条新线上。目前,我已经能够处理信号,而shell只是在提示后打印^C。但是,光标保持在同一行。我想要做的是在提示后打开shell ^C,移到下一行然后打印一个新提示。

我找到了this question,它解决了完全相同的问题。我的问题是我的main调用另一个运行提示循环的函数。我尝试了许多不同的方法来尝试在主链接和提示循环函数中实现上面链接上给出的解决方案,但都没有运气。到目前为止,这是我的代码:

MAIN.C

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include "MyShell.h"

void ctrl_C_handler();

int main(int argc, char **argv) {

    signal(SIGINT, ctrl_C_handler);
    my_shell_loop();

    return EXIT_SUCCESS;
}

void ctrl_C_handler() { 
    //Catches the SIGINT signal fine without anything happening in this function
    //I cannot figure out how to have MyShell print a fresh prompt on a new line 
    //after ctrl+C is pressed
}

MyShellLoop.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "MyShell.h"

char *get_time();

void my_shell_loop() {
    char *line;
    char **args;
    int status;

    char *prompt = (char *) malloc(17);

    do {
        strcpy(prompt, get_time());
        strcat(prompt, " # ");
        printf("%s", prompt);
        line = read_command();
        args = split_command(line);
        status = execute_command(args);

        free(line);
        free(args);
    } while (status);

    free(prompt);
}

修改

使用:

void ctrl_C_handler() { 
    signal(SIGINT, ctrl_C_handler);
    printf("\n");
    my_shell_loop();
}
第一次按下ctrl + c时,

按照需要起作用,但是按下按钮时它会像以前那样动作。

1 个答案:

答案 0 :(得分:0)

signal仅为收到的第一个适当信号附加处理程序。在该调用之后,处理程序被分离。一种常见的方法是让处理程序重新附加在int foo() { signal(SIGINT, &foo); do_the_stuff(); }

然而,signal is non-portable。 POSIX建议改为使用sigaction