2010-03-13 10 views
3

J'essaye d'écrire un programme que le processus parent va prendre les arguments à main() et envoyer les caractères dans les un à la fois au processus de l'enfant à travers un tuyau (un appel à écrire pour chaque caractère). Le processus enfant comptera les caractères envoyés par le processus parent et affichera le nombre de caractères qu'il a reçus du parent. Le processus fils ne doit pas utiliser les arguments de main() de quelque façon que ce soit. L'enfant devrait revenir normalement et ne pas laisser le parent tuer l'enfant.processus parent, et un processus enfant

Est-ce que je compte bien les arguments? Suis-je envoyer les arguments dans un à la fois, et suis-je en train de moissonner l'enfant?

#include <sys/wait.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#define size = 100; 

int main(int argc, char *argv[]) 
{ 

    int i, count =0; 
    int c; 

    int  fdest[2];   // for pipe 
    pid_t pid;    //process IDs 
    char buffer[BUFSIZ]; 



    if (pipe(fdest) < 0)   /* attempt to create pipe */ 
     perror("pipe"); 

    if ((pid = fork()) < 0) /* attempt to create child/parent process */ 

    { 
     perror("fork"); 
    } 


    /* parent process */ 
    else if (pid > 0) { 

     close(fdest[0]); 
     for (i=1; i < argc; ++i) 
     { 
      for (c=0; c < strlen(argv[i]); ++c) { 
       write(fdest[1], &argv[i][c], 1); 
      } 
     } 

     close(fdest[1]);   
     wait(NULL);    
     exit(0); 

    } else { 

     /* child Process */ 
     close(fdest[1]); 

     while (read(fdest[0], &buffer, 1) > 0) 
     { 
      count++; 
     } 


     printf("\nchild: counted %d characters\n", count); 

    } 
    wait(NULL); 
    exit(0); 

} 
+5

Il semble que vous avez déjà posté cette question. Peut-être pourriez-vous expliquer la différence entre cette question et la précédente: http://stackoverflow.com/questions/2390868/passing-command-line-arguments-to-a-child-process-and-count-them –

+0

la différence semble être les restrictions sur l'écriture d'un personnage à la fois à la pipe, et la lecture d'un caractère à la fois de la pipe. –

+0

Besoin d'un devoir? –

Répondre

2

La seconde attente() est superflue; l'enfant n'a pas d'enfants à attendre. La seconde 'sortie (0);' pourrait être remplacé par 'return (0)'. Vous pourriez omettre le précédent 'exit (0);' aussi. Le '#define size = 100;' est inutilisé, ce qui est tout aussi bien puisque le '=' le rend inutilisable dans la plupart des cas (et le point-virgule est aussi une mauvaise idée - une macro se termine rarement par un point-virgule) . Il devrait être '#define size 100' ou 'enum { size = 100 };'. Souvent, les gens utilisent des noms en majuscules pour les «constantes manifestes», d'où «enum { SIZE = 100 };».

Si vous lisez un caractère à la fois, vous n'avez vraiment pas besoin d'un tampon de taille BUFSIZ (qui est généralement de 512 ou plus).

De plus, c'est une mauvaise idée de faire 'for (c = 0; c < strlen(argv[c]); c++)' car cela calcule la longueur de la chaîne à chaque itération. Remplacez-le par l'une de ces:

for (const char *str = argv[i]; *str != '\0'; str++) 
    write(fdest, str, 1); 

for (c = 0, len = strlen(argv[i]); c < len; c++) 
     write(fdest[1], &argv[i][c], 1); 

Vous fermez les extrémités inutilisées des tuyaux - qui est une étape cruciale pour faire les choses correctement.

Le code semble compter correctement. Il fonctionne sur l'étagère quand je l'ai testé. Pourquoi êtes-vous suspicieux que cela ne fonctionne pas?

Questions connexes