背景前景信号终止

时间:2015-11-14 22:21:40

标签: c shell

我必须编写一个shell,它能够打印关于信号终止过程的信息"如果命令被信号终止。

实施例

> sleep 5
^C terminated by signal 2

> sleep 10 &
background pid is 4422
..... // after several lines
background pid is done: exit value 0

> sleep 11 &
background pid is 4442
> kill -15 4442
background pid is done: terminate by signal 15

但是,在我的代码中:

1)如果^C中的sleep 5,它直接从shell退出而不是仅终止睡眠过程。

2)如果我输入sleep 10 &,它会直接打印background pid is 4422: exit value 0。因此,我认为这里没有睡觉,我也无法执行kill -15 <process id>

我最好猜测它与我的launch函数有关(很多人建议使用此函数启动程序并等待它终止)和这是它的样子:

注意:我有一个名为runBg的全局变量,实际上我是为测试人员创建的,如果存在后台进程,那么我将runBg设置为1.但是,我不知道这是不是一个好主意。

int launch(char **args) {
    pid_t pid;
    int status;
    int exitStat = 0;

    pid = fork(); 

    if (pid == 0) { 
        if (execvp(args[0], args) == -1) { 
            printf("error1"); // debugging purposes
            exit(EXIT_FAILURE);
        }
    } else if (pid < 0) { 
        printf("error2"); // debugging purposes
    } else {
        do {
            if (runBg == 0) {
                waitpid(pid, &status, WUNTRACED);
            } else if (runBg== 1) { 
                waitpid(-1, &status, WNOHANG);
            }
        } while (!WIFEXITED(status) && !WIFSIGNALED(status)); 
    }

    if (runBg== 1) {
        printf("Background PID: %d is done: exit value: %d", pid, exitStat);
    }

    if (status != 0 || WIFSIGNALED(status)) {
        exitStat = 1;
    }

    return exitStat;

我尝试进行多次测试,但这一切似乎直接落入error1

第一个if条件execvp ......是麻烦制造者吗?

sleep 15 &似乎也不起作用,因为在do-while循环之后它不会转到最后if statement吗?

期待你的帮助。如果我错过了这个帖子中的信息,请告诉我。谢谢。

0 个答案:

没有答案