C语言 迷你外壳背景



我正在为大学做一个迷你外壳项目,我不知道如何在后台执行命令。我知道的一件事是我必须使用 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");
            }
     }

}

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

使用 waitpid

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

所以。。。将等待替换为waitpid((,并用sigaction((禁用键盘中断(SIGINT和SIGQUIT(,您将在后台执行。

最新更新