Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

joaopaulo93

[Resolvido] [Ajuda] Pipe

Mensagens Recomendadas

joaopaulo93

Pessoal, estou com mais uma duvida no meu programa, após ter conseguido resolver o problema com o FIFO, tive de o alterar para um pipe, como tal faço o direccionamento e supostamente deveria resoltar no entanto, nada acontece entrado em deadlock. O objectivo trata de mandar o que e escrito pelo Cat na shell, para o Cut através de Pipe, e depois do Cut para o Sort atraves de Socket. Tambem ter o Less a espera que o Sort organize o file para imprimir.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>	//FORKS E FILES
#include <sys/types.h>	//
#include <sys/ipc.h>	//shmemory
#include <sys/shm.h>	//
#include <string.h>
#include <fcntl.h>	//O_WRONLY RD_ONLY (FIFO)
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#define ADDRESS	 "mysocket"  /* addr to connect */

int main(){

pid_t fpid[3];
int i;
int fd[2]; //declaração
pipe(fd);


for(i=0;i<3;i++)
{
	fpid[i]=fork();
	if(fpid[i]==0)
		i=3;
}	

if(fpid[0]==0)//=================SORT PROCESS======================================
{

	char c;
	   FILE *file;

		int tamanho, s;
		struct sockaddr_un saun;

	if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
	   	 perror("client: socket");
	   	 exit(1);
	}


	saun.sun_family = AF_UNIX;
	 strcpy(saun.sun_path, ADDRESS);


	tamanho = sizeof(saun.sun_family) + strlen(saun.sun_path);

	while(connect(s,&saun, tamanho)<0);

	dup2(s,0);
		  close(s);
		  close(1);


	 if(open ("file.txt",O_WRONLY | O_CREAT, 0666)<0){ //cria o ficheiro
			  perror ("open");
				exit(1);
		 }

			execl("/usr/bin/sort", "/usr/bin/sort",NULL);




}
else if(fpid[1]==0)//============CAT PROCESS=======================================
	{	
		char a[100]="/etc/passwd";
		int erro[2];
		if(erro[0]=dup2(fd[1], STDOUT_FILENO)<0){ //daqui!!!!!
				perror("fd[1]");
				exit(1);

		}
			   if(erro[1]=close(fd[1])<0){

				perror("close(1)");
				exit(1);		//ate aqui

		}	
		execl ("/usr/bin/cat", "/usr/bin/cat", a, NULL);


	}
	else if(fpid[2]==0)//====CUT PROCESS=======================================
		{

		struct sockaddr_un saun, fsaun;
		int s, ns;
		int fromlen;


		int erro[2];
		if(erro[0]=dup2(fd[0], STDIN_FILENO)<0){  //e depois daqui
				perror("fd[0]");
				exit(1);

		}
			   if(erro[1]=close(fd[0])<0){

				perror("close(1)");
				exit(1);		//ate aqui

		}	
//.........................................SOCKET......................................

		if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
						perror("server: socket");
						exit(1);
			}



			saun.sun_family = AF_UNIX;
			strcpy(saun.sun_path, ADDRESS);


		unlink (ADDRESS);


		int tamanho=sizeof(saun.sun_family) + strlen(saun.sun_path);


		if (bind(s, &saun, tamanho) < 0) {
				perror("server: bind");
				exit(1);
			}



   		 if (listen(s, 5) < 0) {
				perror("server: listen");
	   		 exit(1);
			}




   		if ((ns = accept(s, &fsaun, &fromlen)) < 0) {
	   		 perror("server: accept");
	   		 exit(1);
		 }



		close(s);
		  dup2(ns,1);
			  close(ns);


		execl ("/usr/bin/cut", "/usr/bin/cut", "-d:", "-f", "1", NULL);

		}
		else{

		 wait(NULL);
		  wait(NULL);
		  wait(NULL);
		close (0);


		  if(open ("file.txt",O_RDONLY, 0666)==-1){
				  perror ("open");
					exit(1);
			  }


		execl("/usr/bin/less","/usr/bin/less",NULL);

		}

return 0;
}

Desde já obrigado pela atenção

Editado por joaopaulo93

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

indenta correctamente o teu código ...

(indentação não é uma brincadeira de programadores picuinhas em ter o código bonito ...)

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.