void RunCmd(commandT** cmd, int n) { int i; total_task = n; if(n == 1) { if ((cmd[0]->is_redirect_in) || (cmd[0]->is_redirect_out)) { RunCmdRedirInOut(cmd[0]); } else { RunCmdFork(cmd[0], TRUE); } } else { RunCmdPipe(cmd[0], cmd[1]); for(i = 0; i < n; i++) ReleaseCmdT(&cmd[i]); } }
static void RunBuiltInCmd(commandT* cmd) { int status; sigset_t mask; sigemptyset(&mask); sigaddset(&mask,SIGCHLD); int pid=fork(); if(pid == 0) { if ((cmd->is_redirect_in==1) && (cmd->is_redirect_out==1)){ RunCmdRedirInOut(cmd,cmd->redirect_in,cmd->redirect_out); }else if (cmd->is_redirect_in==1){ RunCmdRedirIn(cmd,cmd->redirect_in); }else if(cmd->is_redirect_out==1){ RunCmdRedirOut(cmd,cmd->redirect_out); } setpgid(0, 0); execv(cmd->name , cmd->argv); }else if(pid < 0) perror("Fork Error, in RunBuiltInCmd"); else { { if(cmd[0].bg==0){ fgpid = pid; waitpid(pid,&status,WUNTRACED); if(WTERMSIG(status) == 127){ // stopped by SIGTSTP fgpid=-1; //add it to backbground addToBg(pid,cmd,2); } return; }else if (cmd[0].bg==1){ sigprocmask(SIG_UNBLOCK,&mask,NULL); //run command background //add the bg process to the bgjoblist addToBg(pid,cmd,0); } } } }