/* calculer < in > out */ #include #include #include #include #include #define N 4 typedef double (*funtab_t)(double); double ajouter_un_dizieme(double d){return d+0.1;} double ajouter_un_centieme(double d){return d+0.01;} double ajouter_un_millieme(double d){return d+0.001;} funtab_t funtab[]={ajouter_un_millieme,ajouter_un_centieme,ajouter_un_dizieme,ajouter_un_millieme}; int nombre_suivant(double *d) { if(read(0,d,sizeof(double)) == sizeof(double)) return 0; return -1; } void executer(int i) { double x = 0.0d; while(nombre_suivant(&x) != -1) { double y = funtab[i](x); write(1, &y, sizeof(double)); } } void fermer_tubes(int* tubes) { for(int i = 0 ; i < N-1 ; i++) {close(tubes[i*2+0]); close(tubes[i*2+1]); } } int main() { /* création de N-1 tubes */ int tubes[N-1][2]; for(int i = 0 ; i < N-1 ; i++) { /* TODO: création tube */ } /* création de N fils */ for(int i = 0 ; i < N ; i++) { /* fils i qui utilise tubes[i] et tubes[i+1] */ if(fork() == 0) { /* TODO: redirection tube */ fermer_tubes((int*)tubes); executer(i); return 0; } } fermer_tubes((int*)tubes); /* attente de tous les fils */ for(int i = 0 ; i < N ; i++) wait(NULL); return 0; }