Esempio n. 1
0
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]);
		}
	}

}
Esempio n. 2
0
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;
}