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)); }
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); }
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; }