int run_pipe(command_t **comandos, int num_args, int num_args0) //pipeline { int pd[2]; int pid; if(pipe(pd) < 0){ perror("pipe"); exit(1); }else{ pid = fork(); if (pid < 0) { //erro perror("fork"); exit(1); }else if (pid > 0){ //processo pai - roda o comando close(1); dup2(pd[1], 1); close(pd[1]); close(pd[0]); if(num_args != 0) run_pipe(comandos,num_args-1, num_args0); else return 0; }else{ //processo filho - continua o pipeline close(0); dup2(pd[0], 0); close(pd[0]); close(pd[1]); executa_comando(comandos[num_args0-num_args]); } } }
int main(int argc, char * argv[], char *envp[]){ char buscar[MAX_LINHA_COMANDOS]; Comandos comandos[NR_COMANDOS]; //sighandler_t old_handler; int controlo =0; int continuar = 1; //manter-se no ciclo principal int k=1; clear_screen(); /*************************************************************** ******************* INTRO SCREEN ****************************** **************************************************************/ printf("******************************************************************************\n"); printf("* My Shell - Versao 7 *\n"); printf("*================================= Pipes ====================================*\n"); printf("* Desenvolvido no ambito de Sistemas Operativos - Disciplina do Terceiro Ano *\n"); printf("* do Mestrado I. em Engenharia Informatica e de Computacao da Faculdade de *\n"); printf("* Engenharia da Universidade do Porto. *\n"); printf("*============================================================================*\n"); printf("* Desenvolvida por: *\n"); printf("*- Simao Belchior de Castro *\n"); printf("*- 040509100 *\n"); printf("*- Contactos *\n"); printf("* - [email protected] *\n"); printf("* - +351 91 790 17 60 *\n"); printf("* *\n"); printf("*\"Handle with Care\" *\n"); printf("******************************************************************************\n\n"); fflush(stdout); printf("mysh> "); while(continuar==1) //Ciclo Principal { k = 1; fflush(stdout); fgets(buscar, MAX_LINHA_COMANDOS, stdin); strtok(buscar, "\n"); //remover o \n inserido pelo fgets. controlo = separa_comandos(buscar, comandos); //Executar os comandos while (controlo >0) { //old_handler = signal(SIGINT, cc_handler); if(!strcmp(comandos[k-1].argv[0] ,"exit")) { continuar = 2; printf("Au revoir!\n"); break; } else{ if(comandos[k-1].output ==-1 || comandos[k-1].input == -1) break; //Se der erro com o // ficheiro de output //ou input comando nao é executado else{ if(comandos[k-1].forma == BACKGROUND) { executa_bg_comando(comandos[k-1]); } else if(comandos[k-1].forma == FOREGROUND) { executa_comando(comandos[k-1]); } k++; controlo--; } } //signal(SIGINT, old_handler); } if(continuar ==1) { printf("mysh> "); } } return 0; }