信号处理程序多次运行

时间:2015-02-16 06:47:57

标签: c ubuntu signals

目前正在编写一个基本shell,用于处理各种其他函数的信号中断。

int numberOfCommands = 0;
int signalHandlerFired = 0;
char history[HISTORY_DEPTH][COMMAND_LENGTH];

void handle_SIGINT(){
            writeHistory();
            signalHandlerFired = 1;

}

int main(int argc, char* argv[])
{
    char input_buffer[COMMAND_LENGTH];
    char *tokens[NUM_TOKENS];
    char cwd[COMMAND_LENGTH];
    struct sigaction handler;
    handler.sa_handler = handle_SIGINT;
    sigaction(SIGINT, &handler, NULL);

    while (true) {
        signalHandlerFired = 0;
        getcwd(cwd,  sizeof(cwd));
        write(STDOUT_FILENO, cwd, strlen(cwd));
        write(STDOUT_FILENO, "> ", strlen("> "));

        _Bool in_background = false;        
        read_command(input_buffer, tokens, &in_background);
        if (signalHandlerFired == 1) {
            continue;
        }
        char exclamationCommand[2];
        exclamationCommand[0] = tokens[0][0];
        exclamationCommand[1] = '\0';
        char* hcNumber = &tokens[0][1];
        if (strcmp(&exclamationCommand[0], "!") == 0) {
            if (atoi(hcNumber) == 0) {
            } else {
                retrieveHistory(hcNumber, numberOfCommands, input_buffer, tokens, in_background);
            }
            continue;
        }
        insertHistory(&numberOfCommands, input_buffer, tokens);


        //exit
        if (strcmp(tokens[0], "exit") == 0) {
            exit(0);
        }

        //pwd
        if (strcmp(tokens[0], "pwd") == 0) {
            getcwd(cwd,  sizeof(cwd));
            write(STDOUT_FILENO, cwd, strlen(cwd));
            write(STDOUT_FILENO, "\n", strlen("\n"));
            continue;
        }       
        //cd
        if (strcmp(tokens[0], "cd") == 0) {

            int dcSuccess = chdir(tokens[1]);
            if (dcSuccess == -1) {
                write(STDOUT_FILENO, "Invalid Directory", strlen("Invalid Directory"));
                write(STDOUT_FILENO, "\n", strlen("\n"));
            }
            continue;
        }
        //history
        if (strcmp(tokens[0], "history") == 0) {
            writeHistory(tokens[0]);
        }


        executeCommand(numberOfCommands, input_buffer, tokens, in_background);

    }
    return 0;
}

main()的while循环中,它从命令行获取输入并根据输入的命令类型进行处理,信号处理程序将运行两次或更多次,具体取决于...是我不知道的。

SIGINT [Ctrl + C]中断的目的是显示命令历史记录。如果我运行一次,但在...之后,这可以正常工作。

/home/ahn/> ls
   Token: ls
a.out     Makefile.txt~   shell    shell.c~  shellsample.c~
Makefile  mystring_sol.c  shell.c  shell.o
/home/ahn/> ^C
History:
1    ls 
---------------Second Run
/home/ahn/> ks
   Token: ks
Unknown Command
/home/ahn/> ^C
History:
Number Of Commands: 2
1    ls 
2    ks 
/home/ahn/> 
History:
Number Of Commands: 2
1    ls 
2    ks 
/home/ahn/> 

我认为在中断发生时我没有清楚的理解,程序中的这一点也在返回。而且,我不知道为什么它会运行两次。如果需要,我将提供任何函数定义。

此外,char ks出现了损坏。如果需要,可以使用完整核心here

0 个答案:

没有答案