コード例 #1
0
ファイル: pipe_inf.c プロジェクト: GastaldiRemi/42sh
int			init_loop(t_plist *plist, t_cmd *cmd, int n, char **env)
{
  int			i;
  int			fd[2];
  int			in_out[2];

  in_out[0] = 0;
  i = -1;
  while (++i < n -1)
    {
      pipe(fd);
      in_out[1] = fd[1];
      loop_pipe(plist, in_out, cmd->cmd, env);
      cmd = cmd->next;
      close (fd[1]);
      in_out[0] = fd[0];
    }
  if (in_out[0] != 0)
    dup2(in_out[0], 0);
  return (check_action(cmd->cmd, env, plist));
}
コード例 #2
0
ファイル: gen_pipes.c プロジェクト: lmatshay/N.L-Matshaya
int				execute_pipe(char *str)
{
	char	**put_in_sst;
	char	***temp;

	if (str)
	{
		put_in_sst = put_in_ss(str);
		if (put_in_sst)
		{
			temp = put_in_sss(put_in_sst);
			if (temp)
			{
				loop_pipe(temp);
				freed(temp);
			}
			ft_free2d(put_in_sst);
		}
		return (1);
	}
	else
		put_str(ANSI_COLOR_RED"str passed to pipe is 'NULL'"ANSI_COLOR_RESET);
	return (0);
}
コード例 #3
0
ファイル: main.c プロジェクト: prachiagrawal269/os_shell
int main(int argc, char *argv[])
{
	//struct rusage usage; 
	int status,i,l,j,ii,length,l1,l2,controld,start,end,bpid;
	char *input_str;
	char c;
	int internal=0;
	int job_no;
	char **ncomms;
	char **args_copy;
	char prompt[1000];
	char user[100],host[100];
	pid_t pid;
	controld=0;
	//createsignal();
	shell_pgid=getpid();
	if (setpgid (shell_pgid, shell_pgid) < 0)
    {
        perror ("Couldn't put the shell in its own process group");
        exit (1);
    }

	// handle sigint with hello
	signal(SIGINT, SIG_IGN);

	if(getcwd(home, sizeof(home))!=NULL)
	{	
		while(1)
		{
			position=0;
			backexit=0;
			//		back_index=0;
			flag=0;
			//		printf("<prachi@LenovoG500s");
			if(controld==0)
				printprompt();
			controld=0;
			for(i=0;i<1000;i++)
				prompt[i]='\0';

			if(getcwd(prompt, sizeof(prompt))!=NULL)
			{
				input_str=get_input();
				if(input_str[0]!='\0')
				{i=0;
				ncomms=split_input3(input_str,1);
				position=ind;
				while(position--)
				{
				//	printf("pid: %d\n",shell_pgid);
					internal=0;
					// args contains the "pipe" parsed commands 
					args=split_input3(ncomms[i],2);
					if(args[0]!="\0");
					{
						// check for built in commands
						if(args[0][0]=='c' && args[0][1]=='d')
							internal=1;
						else if(args[0][0]=='e' && args[0][1]=='x' && args[0][2]=='i' && args[0][3]=='t')
							internal=1;
						else if(args[0][0]=='e' && args[0][1]=='c' && args[0][2]=='h' && args[0][3]=='o')
							internal=1;
						else if(args[0][0]=='p' && args[0][1]=='w' && args[0][2]=='d')
							internal=1;
						else if(args[0][0]=='q' && args[0][1]=='u' && args[0][2]=='i' && args[0][3]=='t')
							internal=1;
						else if(args[0][0]=='f' && args[0][1]=='g')
						{
						//	printf("fg\n");
							internal=-1;
						}
						if(internal!=1 && internal!=-1)
						{
							int len;
							len=strlen(args[0]);
							if(args[0][len-1]=='&')
								back_mark=1;
							pid=fork();
							if(pid==0)
								loop_pipe(args);
							else if(pid<0)
								perror("myshell");
							else 
							{
								if(back_mark!=1)
									waitpid(pid,&status, WUNTRACED);
								else
							    {
									signal(SIGCHLD, childhandler);
									strcpy(copy,args[0]);
									len=strlen(copy);
									copy[len-1]='\0';
									strcpy(back_job[back_index].processname,copy);
									//		printf("args: %s",args[0]);
									back_job[back_index].pro_id=pid;
									back_job[back_index].back_active=1;
									back_index++;
									back_mark=0;										
									// storing background processes data(pid , name) into an array
									printf("%d\n",pid);
								}
							}
						}
						else if(internal==1)
						{
							args=split_input2(args[0]);
							// if built-in commands
							execute_internal(flag);
						}  
						else if(internal==-1)
						{
							// execute fg
							pid_t fpid;
							int status;
							args=split_input2(args[0]);
							fpid = execute_fg(atoi(args[1]));
					//		printf("fpid: %d\n",fpid);
							if(fpid>0)
							{
								kill(fpid, SIGCONT);
								waitpid(fpid,&status,WCONTINUED);
							}
						} 
					}	
					i++;
				}
				free(input_str);
				free(args);
			}
			else
				controld=1;
			}
			else
				perror("myshell:");
		}
	}
	else
	{	perror("myshell:");
		return EXIT_SUCCESS;
	}
	return 0;
}