コード例 #1
0
ファイル: shell.c プロジェクト: catuss-a/42sh
int			my_exec(t_config *conf, char *line, int *ret)
{
  t_ll_list		commands;
  int			sig;
  t_ll_node		*w;

  ll_init_list(&commands);
  sig = MYSH_SIGNAL_NOPE;
  split_commands(&commands, line, ";", 0);
  w = commands.head;
  while (w)
    {
      if (*((char *)w->data) &&
	  (sig = manage_conditions(w->data, conf, ret)) == MYSH_SIGNAL_EXIT)
	break;
      w = w->next;
    }
  ll_clear_list(&commands, free);
  return (sig);
}
コード例 #2
0
ファイル: mshell.c プロジェクト: kasiajanocha/shell
int exec() {
	int pid;
	int pipe_sdf[2];
	int there_was_pipe;
	int new_input;
	int i;
	int bcg;
	int status;
	command_s* cmds;
	there_was_pipe = 0;
	new_input = -1;

	bcg = in_background(input_buf+beg);
	cmds = split_commands(input_buf+beg);
	if(cmds[0].argv==NULL) {
		return 0;
	}

	sigprocmask(SIG_BLOCK, &block_sig, NULL);

	if(shell_commands(cmds[0])) {
		sigprocmask(SIG_UNBLOCK, &block_sig, NULL);
		return 1;
	}

	there_was_pipe = 0;
	chld_pids_size = 0;
	chld_active = 0;
	new_input = -1;

	for(i = 0; cmds[i].argv != NULL; i++) {
		if(cmds[i+1].argv != NULL)  { /* mamy pipe'a */ 
			pipe(pipe_sdf);
			there_was_pipe = 1;
		}
		chld_pids_size++;
		chld_active++;
		pid = fork();
		if(pid == 0) {
			sigaction(SIGINT, &default_sigint_action, NULL);
			sigaction(SIGCHLD, &default_sigchld_action, NULL);

			/* tworzenie nowej sesji */
			if(bcg) setsid();
			/* wpp odblokowujemy SIGCHLD */
			sigprocmask(SIG_UNBLOCK, &block_sig, NULL);

			/*trzeba przekierowac wyjscie*/
			if(there_was_pipe) {
				dup2(pipe_sdf[1], STDOUT_FILENO);
				close(pipe_sdf[1]);
				close(pipe_sdf[0]);
			}
			/*przek wyjscia*/
			if(new_input != -1) {
				dup2(new_input, STDIN_FILENO);
				close(new_input);
			}
			/*wywolywanie pojedynczej komendy*/
			exec_one(cmds[i]);
		} else if(pid > 0) {
			if(!bcg) chld_pids[i] = pid;
			if(there_was_pipe) {
				close(new_input);
				close(pipe_sdf[1]);
			}
		}
		if(there_was_pipe) {
			new_input = pipe_sdf[0];
		}
		there_was_pipe = 0;
	}
	if(!bcg) {
		while(chld_active > 0) {
			sigsuspend(&wait_for_us);
			/*	---FOR LINUX---
			pid = waitpid(-1,&status,0); 
			bcg = 1;
			if (pid <= 0) {
				continue;
			}
			for (i=0;i<chld_pids_size;i++) if(chld_pids[i] == pid) bcg = 0;
			if (!bcg) {
				chld_active--;
			} else if (ended_processes < MAX_COMMANDS) {
				save_process(pid,status);
			}*/
		}
	}
	chld_pids_size = 0;
	sigprocmask(SIG_UNBLOCK, &block_sig, NULL);
	return 1;
}