迷你shell项目中的信号处理程序

时间:2015-10-19 10:29:59

标签: c signals exec fork handler

这是我的信号处理程序中发生的事情。 signal_flag也是一个全局变量。

volatile sig_atomic_t signal_flag = 0;
void sig_handler(int signo) {
    if (signo == SIGTSTP) {
        signal_flag = 1;
    }
}

这是发生的情况,前提是我的fork()工作正常。我把睡眠设置为5,所以我有足够的时间按下CTRL + Z命令,我将作为输入并暂停该过程。

        pid_t child_pid = fork();
        int status;
        //GOT A SIGNAL.
        if (signal(SIGTSTP, sig_handler) != SIG_ERR) {
            signal(SIGTSTP, SIG_IGN);
            kill(child_pid, SIG_IGN);
            insert_suspended_process(child_pid, ACTIVE);
            //_exit(EXIT_SUCCESS);
        }
        if (child_pid < 0) {
            fprintf(stderr, "execute: fork failed.\n");
            exit(EXIT_FAILURE);
        }
        if (child_pid == 0) {
            /* child process. */
            //print_child_messages();
            char bin[512];
            strcpy(bin, command[0]);
            //strcat(bin, command[0]);

            if (bars > 0) {
                //Houston, we have pipes, I REPEAT, WE HAVE PIPES!
                int pipefd[2], status;
                pid_t cpid;
                if (pipe(pipefd) == -1) {
                    fprintf(stderr, "execute: pipe failed.\n");
                    exit(EXIT_FAILURE);
                }
                cpid = fork();

                pipe(pipefd);

            }
            sleep(3);


            //executing...
            execvp(bin, command);
            _exit(EXIT_SUCCESS);        //safer than exit().
        }
        else {
            /* parent process. */
            //print_parent_messages(child_pid);
            //signal(SIGTSTP, SIG_IGN);


            waitpid(child_pid, NULL, 0);

        }

我将shell作为家庭作业的一部分,我要求处理SIGTSTP信号,当用户按下CTRL + Z时,我的shell将暂停正在进行的过程(我有设置sleep(3)所以我可以暂停一个简单的ls -al进程 我的问题是我的代码通过insert_suspended_process(pid_t)函数将带有该pid的进程添加到我的列表中,但是没有按下CTRL + Z信号就会发生这种情况。任何想法或quidelines?

1 个答案:

答案 0 :(得分:0)

你似乎没有在if(i == 12)中检查fork()的结果。在fork之后安装信号处理程序是一个等待发生的问题..