Minishell背景

时间:2017-04-04 18:32:25

标签: c shell waitpid sigaction

我正在为大学做一个minishell项目,我不知道如何在后台执行命令。我知道的一件事是我必须使用waitpid()和sigaction(),但我不知道如何。如果有人愿意帮助我,我将感激不尽。这是我使用的代码的一部分,用于使用minishell命令。

void execute_command_line(command* cmds, int n){
        pid_t id,pid;
        int status;
        id=fork();
        if(id==-1){
            exit(EXIT_FAILURE);
        }
        else if(if==0){
                 execvp(cmds[0] . argv[0],&cmds[0] .argv[0]);
                 exit(0);
        }
        else{
             pid=wait(&status);
             if(pid==-1){
                perror("Father: an error has ocurred.\n");
                exit(EXIT_FAILURE);
             }
             else if(pid==id){
                     printf("Father: the son has ended.\n");
            }
     }

}

1 个答案:

答案 0 :(得分:0)

后台进程的一个关键特性是您无法与之交互(但它仍然可以打印到您的终端)。这至少意味着键盘生成的信号不得传送到该过程。 这可以通过调用setsid()创建一个新会话来完成,或者可以通过简单地禁用子节点中的键盘信号来模拟它(有你的sigaction)。

使用waitpid意味着你的父母可能不会立即退出,而是等待(使用waitpid)后台孩子完成。

所以...用waitpid()替换wait并用sigaction()禁用键盘中断(SIGINT和SIGQUIT),然后你就可以执行后台了。