pipe_lec.c 1.61 KB
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>


int main(int argc, char * argv[]){
    if(argc != 2){
        return 1;
    }
    int fils1, fils2;
    int entierCourant;
    int tube[2];
    if(pipe(tube)<0){
        
        perror("erreur pipe");
        exit(1);
    }
    
    if((fils1=fork())<0){
        perror("erreur exec du fork");
        exit(1);
    }
    if(fils1 == 0){
        close(tube[0]); //fils 1 ne lit pas 
        printf("entiers:\n");
        scanf("%d",&entierCourant);
        while(entierCourant != 0){
            if(entierCourant%2==0){
                write(tube[1], &entierCourant, sizeof(int));
            }
            scanf("%d",&entierCourant);
        }
        close(tube[1]);
    }
   
    else {
        if((fils2=fork())<0){
            perror("erreur exec du fork");
            exit(1);
        }
        if(fils2 == 0){
            close(tube[1]); //fils 2 n'écrit pas
            while(read(tube[0],&entierCourant,sizeof(int))==sizeof(int)){
                if(entierCourant > atoi(argv[1])){
                    printf("%d \n",entierCourant);
                }
            }
            close(tube[0]);
        } 
        else{
            int r, pid;
            
            close(tube[1]);
            close(tube[0]);
           
            if((pid= wait(&r)) <0){
                perror("erreur exec du wait");
                exit(1);
            }
            if((pid= wait(&r)) <0){
                perror("erreur exec du wait");
                exit(1);
            }
            printf("\nDans le père, traitement fini\n");
        }
    }
    return 0;
}