Example #1
0
	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]);
      		}
	}
Example #2
0
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);
          }
        }
    }
}