2010-10-30 4 views
0

Voici l'histoire: (! Enfant d'un processus enfant)question du programme Unix C en utilisant les tuyaux et les processus

écrire un programme en C qui crée un processus enfant et un processus de granchild. Le processus père doit lire le contenu d'un fichier dont le nom sera considéré comme un argument lors de l'exécution du programme. Le père devrait envoyer le texte lu à l'enfant, ce qui prend pour convertir les caractères 'a' trouvés dans 'o'. Le texte modifié enverra l'enfant à petit-enfant que (le petit-enfant) prendra pour compter le nombre de lignes et le nombre de caractères 'o' dans le texte et imprimer le résultat sur l'écran (et éventuellement un fichier output.txt). Donc je crée un fichier avec quelques caractères 'a' à l'intérieur et je ne peux pas vraiment convertir ces caractères en 'o'.

La question est quel type de commande dois-je utiliser pour la conversion de caractères?

Toute aide très appréciée.

Voici ce que je l'ai fait jusqu'à présent:

#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <string.h> 
int main() { 
int fd_1[2],fd_2[2],pointer,pointer2,pid1,pid2,i,n; 
char filename[200]; 
char buffer[500000]; 

printf("Input filename:"); 
fflush(stdout); 

fflush(stdin); 

scanf("%s", filename); 

pointer = open(filename, O_RDONLY); 
    if (pointer == -1) { 
    printf("file does not exist\n"); 
    } 
pipe(fd_1); 
if (pipe(fd_1) == -1) { 
    perror("pipe"); 
    exit(1);  
    } 
pid1=fork(); 

switch(pid1){ 
    case -1: { 
     perror("fork"); 
     exit(10); 
     break; 
    } 
    case 0: { //child process 
     pipe(fd_2); 
     if (pipe(fd_2) == -1) { 
      perror("pipe"); 
      exit(1);  
     } 
     pid2=fork(); 
     switch(pid2) { 
      case -1: { 
       perror("fork"); 
       exit(10); 
       break; 
      } 
      case 0: { //grandchild process 
       close (fd_2[1]); 
       break; 
      } 
      default: { //child process 
       close (fd_1[1]); 
       dup2(fd_1[0],1); 
       pointer2 = open(buffer, O_WRONLY); 
       for (i=0; i< sizeof(buffer) ; i++) 
       if (buffer[i] == 'a') { 
        buffer[i] = 'o'; 
       }  
       write(fd_1[1], buffer, sizeof(buffer)); 
       wait(&pid2); 
       break; 
      } 
     } 
    } 
    default: { //parent process 
     close (fd_1[0]); 
     dup2(fd_1[1],0);  
     n = read(pointer, buffer, 200); 
     write(fd_1[1], buffer, n); 
     wait(&pid1); 
     break; 
    } 
} 
return 0; 
} 
+1

Quelle est votre question? On dirait que vous pêchez pour quelqu'un pour faire un morceau de cours pour vous. – ak2

+1

J'ai mis à jour le sujet avec la question pour laquelle je dois obtenir une réponse. Je suppose que vous aviez raison, sans une question appropriée, il pourrait sembler que je pêchais. Mes excuses –

Répondre

1

En supposant que l'enfant a lu le tuyau dans un tampon puis quelque chose comme:

for (int i = 0; i < bytes_read; ++i) 
{ 
    if (buffer[i] == 'a') 
     buffer[i] = 'o'; 
} 
+0

+1, ... il pourrait engendrer des enfants et créer des tuyaux, mais ne pas trouver «un» dans un flux d'octets? Wierd monde. – slezica

+0

@Santiago Lezica - D'accord. Il y a d'autres problèmes mais le tuyau manquant lit et itère/écrit le tampon entier plutôt que ce qui a été lu ressemble au raccrochage courant. – Duck

Questions connexes