1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

duvida com pipes em C

Discussão em 'Programação' iniciada por The Dealer, 7 de Junho de 2009. (Respostas: 6; Visualizações: 983)

  1. The Dealer

    The Dealer Power Member

    Código:
    #include "bib.h"
    
    #define MAXNUM 100
    
    char frase[MAXNUM];
    int resposta;
    int n;
        
    int main (int argc, char *argv[]){
    
        
        int fd1[2];
        int fd2[2];
        int pid;
        
        pipe(fd1); // abre os pipes
        pipe(fd2);
        pid = fork();
        
        if(pid>0) // pai
            {
            scanf("%s",frase);
            write(fd1[1],frase,100);
            read(fd2[0],n,100);
            printf("\n%d\n",n);
            }
        
        
        if(pid==0) // filho
            {
            read(fd1[0],frase,100);
            n = strlen(frase);
            //printf("%d",n);
            write(fd2[1],n,100);
        }
    }
    
    Alguem me consegue explicar porque é que nao esta a enviar n (ou o pai nao esta a receber bem). No entanto aquele printf funciona..
     
  2. Baderous

    Baderous Banido

    Precisas de fazer o wait do filho (no pai) para que depois possas ler o que ele escreveu.
     
  3. blackburn69

    blackburn69 Power Member

    Os teus erros estão aqui:
    Código:
    read(fd2[0],n,100);
    ...
    Código:
    write(fd2[1],n,100);
    Deveria ser:
    Código:
    read(fd2[0], &n, 4);
    ...
    Código:
    write(fd2[1], &n, 4);
    Escreve e lê 4 bytes (tamanho de um int) do endereço de n.
     
  4. The Dealer

    The Dealer Power Member

    lamento ser do contra mas isso não funciona..
     
  5. blackburn69

    blackburn69 Power Member

    Se não funciona é porque tens mais qualquer coisa errada. Mas necessitas disso, senão está errado.
    Código:
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    
    #define MAX 50
    
    int main (int argc, char *argv[]){
        
        int fd1[2], fd2[2];
        char sndBuffer[MAX];
        char rcvBuffer[MAX];
        int n = -1;
        
        pipe(fd1);
        pipe(fd2);
        
        if(fork()) {
        	fgets(sndBuffer, MAX-1, stdin);
            write(fd1[1], sndBuffer, 50);
    	printf("Pai enviou: %s", sndBuffer);
            read(fd2[0], &n, 4);
    	printf("Pai recebeu: %d\n", n);
        }
        else {
            read(fd1[0], rcvBuffer, MAX);
            printf("Filho recebeu: %s", rcvBuffer);
    	n = strlen(rcvBuffer);
            write(fd2[1], &n, 4);
            printf("Filho enviou: %d\n", n);
        }
    
        return 0;   
    }
    Este código funciona.

    Já agora fica aqui citada parte da man page do read e do write:

    Repara nas partes a negrito. Recebe endereços. :)
    E já agora, Baderous não é necessário porque o read e o write são tipicamente bloqueantes, ou seja, só não o são se assim o desejares. :) Logo, o fluxo de execução fica parado lá até haver alguma coisa para ler ou para escrever.

    Aqui fica mais um exemplo em tudo semelhante ao outro, mas que envia um OK! em vez do tamanho da string.

    Código:
    #include <stdio.h>
    #include <unistd.h>
    
    #define MAX 50
    
    int main (int argc, char *argv[]){
        
        int fd1[2], fd2[2];
        char sndBuffer[MAX];
        char rcvBuffer[MAX];
        char *reply = "OK!\n";
    
        pipe(fd1);
        pipe(fd2);
        
        if(fork()) {
        	fgets(sndBuffer, 49, stdin);
            write(fd1[1], sndBuffer, 50);
    	printf("Pai enviou: %s", sndBuffer);
            read(fd2[0], rcvBuffer, 5);
    	printf("Pai recebeu: %s", rcvBuffer);
        }
        else {
            read(fd1[0], rcvBuffer, MAX);
            printf("Filho recebeu: %s", rcvBuffer);
            write(fd2[1], reply, 5);
            printf("Filho enviou: %s", reply);
        }
    
        return 0;   
    }
    
    Já agora, não sei em que contexto é que estás a usar 2 pipes, mas poderias em vez disso usar um socket em domíno PF_UNIX que fazia o mesmo trabalho e era mais fácil porque andavas só com um file descriptor em vez de 2. Fica a sugestão. :)
     
    Última edição: 7 de Junho de 2009
  6. Baderous

    Baderous Banido

    Obrigado pela explicação, acho que já me tinham dito isso mas já não me lembrava. ;)
    LOL, olhei agora para o caderno que tenho aberto aqui à minha frente (também estou a estudar isto) e vi lá escrito esse apontamento que tirei na aula. xD
     
  7. The Dealer

    The Dealer Power Member

    tinha o problema faltava.me o & atrás do n. obrigado :)
     

Partilhar esta Página