2011-03-30 4 views
0

Je vous écris un programme qui prendra dans un fichier d'entrée comme suit:C/Unix Programmation problème avec Pipes

1 1 1 1 
1 1 1 1 
1 1 1 1 
4 4 4 4 

Il se divisera() un nouveau processus enfant pour chaque ligne et chaque enfant le processus calculera la somme de leur rangée respective (elle a été codée en dur, bien qu'il soit trivial de la changer en un cas général).

Le code est le suivant:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <string.h> 
#include <sys/wait.h> 
#include <ctype.h> 

#define cols 100 //not used 
#define rows 4 //easily modifiable 

int main() 
{ 
int count=0; //count for children 
int fd[2]; 
FILE *fp = fopen("input.dat", "r"); 
setbuf(fp,NULL); //unbuffered 

double sum = 0; //parent sum (and average) 
int childStatus; //used in the wait command 

char c; //char for reading in numbers 
int pid; //store process id 
int childsum=0; 

for(count=0;count<rows;count++) 
{ 
    pipe(fd); 
    pid=fork(); //duplicate process 

    if(pid==0) //if child is done 
    { 
     close(fd[0]); //close the reader 
     childsum=0; //child's sum 
     while(c!='\n') 
     { 
      fread(&c, sizeof(c), 1, fp); //read in integer 
      if(c != ' ') 
      { 
       childsum=childsum+atoi(&c); //to calculate the sum 
      } 
     } 
     write(fd[1], &childsum, sizeof(int));//write to pipe 
     printf("Child %d: %d\n", count+1, childsum); //output child's sum to the screen 
     close(fd[1]); //close remaining file 
     exit(0); //exit current child 

    } 
    else 
    { 
     close(fd[1]); //close the writer 
     //read from pipe 
     char* buf; 
     while(read(fd[0], buf, sizeof(buf))!=sizeof(buf)) 
     { 
      sum = sum + atoi(buf); 
     } 
     close(fd[0]); //close remaining file 
    } 

} 
sum = sum/count; 
printf("Parent Average: %f", sum); 
fclose(fp); 
return 0; //end 
} 

Le code a fonctionné très bien une fois, et la seule erreur était que la moyenne des parents (sum) n'a pas été calculé. Cependant, quand je l'ai exécuté de nouveau, il s'arrête après avoir imprimé la première somme de l'enfant (dans ce cas, 4). Pourquoi cela pourrait-il se produire si elle fonctionnait déjà une fois? Qu'est-ce qui provoque son arrêt?

Répondre

3

Il y a plusieurs problèmes avec votre code:

  • le processus parent se lit dans buf pour lequel vous ne l'avez pas la mémoire allouée (ce qui est la raison la plus probable pourquoi tout le tralala se bloque);
  • vous écrivez childsum comme des données binaires mais en essayant de le lire comme une chaîne ASCII contenant le nombre.
+0

Je suis confus quant à la façon dont je peux obtenir que les données lues correctement. J'essaie de sortir en utilisant la fonction read(). – muttley91

+0

Que diriez-vous d'un 'read()' dans un 'int' (pour refléter le' write() ')? – NPE