2010-04-08 7 views
1

J'ai essayé de faire fourche() et la tuyauterie en main et cela fonctionne parfaitement bien, mais quand j'essaye de l'implémenter dans une fonction pour une raison quelconque je ne reçois aucune sortie, ceci est mon code:Forking avec des tuyaux

void cmd(int **pipefd,int count,int type, int last);  

int main(int argc, char *argv[]) { 
int pipefd[3][2]; 
int i, total_cmds = 3,count = 0; 
int in = 1; 

for(i = 0; i < total_cmds;i++){ 
pipe(pipefd[count++]); 
cmd(pipefd,count,i,0);  
} 

/*Last Command*/ 
cmd(pipefd,count,i,1);  

exit(EXIT_SUCCESS); 
} 

void cmd(int **pipefd,int count,int type, int last){  
    int child_pid,i,i2; 

    if ((child_pid = fork()) == 0) { 

      if(count == 1){ 
       dup2(pipefd[count-1][1],1); /*first command*/ 
      } 
      else if(last!=1){ 
       dup2(pipefd[count - 2][0],0); /*middle commands*/ 
       dup2(pipefd[count - 1][1],1); 
      } 
      else if(last == 1){ 
       dup2(pipefd[count - 1][0],0); /*last command*/ 
      } 


      for(i = 0; i < count;i++){/*close pipes*/ 
      for(i2 = 0; i2 < 2;i2++){ 
       close(pipefd[i][i2]); 
      }} 



      if(type == 0){ 
       execlp("ls","ls","-al",NULL); 
      } 
      else if(type == 1){ 
       execlp("grep","grep",".bak",NULL); 
      } 
      else if(type==2){ 
           execl("/usr/bin/wc","wc",NULL); 
      } 
      else if(type ==3){ 
         execl("/usr/bin/wc","wc","-l",NULL); 
      } 
      perror("exec"); 
      exit(EXIT_FAILURE); 
    } 
    else if (child_pid < 0) { 
      perror("fork"); 
      exit(EXIT_FAILURE); 
    } 
} 

J'ai vérifié les descripteurs de fichiers et il ouvre les bons, pas sûr de ce que le problème pourrait être ..

Edit: je résolu le problème, mais je vais avoir des processus enfants, de quelle manière serait soyez le meilleur pour attendre l'enfant, while (wait (NULL)! = - 1); mais qui pèse

+0

Vous ne pouvez pas passer 'pipefd [3] [2]' (un tableau bidimensionnel conventionnel) comme 'int **' voir http://c-faq.com/aryptr/ary2dfunc3.html –

Répondre

2

Le problème est que pipefd est pas un int**, c'est un int[3][2], alors quand vous passez à cmd, vous obtenez des ordures. Votre compilateur devrait être vous donner un avertissement sur chaque appel à cmd(), comme quelque chose comme ceci:

warning: passing argument 1 of 'cmd' from incompatible pointer type 

Sinon, augmentez votre niveau d'alerte.

Il est vrai que la décomposition des tableaux en pointeurs vers leurs premiers éléments, donc vous pouvez passer un tableau 1-D à une fonction attendant un pointeur, mais qui est seulement vrai pour la première dimension de tableaux. En particulier, un tableau 2D ne pas se désintègre en un pointeur vers un pointeur. Il se désintègre au premier niveau seulement, donc pipefd peut se désintégrer dans le type int (*)[2], qui est lu comme « pointeur sur un tableau 2 de int »

Ainsi, la bonne façon d'écrire cmd est ceci:

void cmd(int (*pipefd)[2],int count,int type, int last) 
+0

Ahh Okay Qui a résolu certains problèmes du problème, mais dans cette méthode serait le meilleur moyen de tuer les processus de l'enfant – Luke

+0

Il semble fonctionner maintenant, mais mon programme se bloque – Luke