2016-03-06 1 views
-1

Ceci est un exemple de mon code pour une tuyauterie que je veux faire. Le problème est que pid2 [0] ne me fournit pas de processus fils. Comment je le répare? pid2 [1] et pid2 [2] et ainsi de suite fournissent le parent avec des enfants.Boucler une fourche()

int numCommands = numPipes + 1;  /// not worrying about '>' and '<' right now 
int *pipes = newint[numPipes*2];  /// two ends for each pipe 
for(int i = 0; i < numPipes*2; i+=2) /// Offset by two since each pipe has two ends 
    pipe(pipes + i); 
int *pid2 = new int [numCommands]; 

for(int i = 0; i < numCommands; i++) 
{ 
    pid2[i] = fork(); 
    if(pid2[i] < 0) 
    { 
     std::cerr << "Failure to fork..." << std:endl; 
     return EXIT_FAILURE 
    } 

    if(pid2[i] == 0) /// Child process 
    { 
     if(i == 0)  /// First Command 
     { 
     dup2(pipes[1], 1); 
     } 

     else if(i == numCommands -1) /// Last Command 
     { 
     dup2(pipes[2*(numCommands-1)-1], 0); 
     } 

     else    /// Middle commands 
     { 
     dup2(pipes[2*(i-1)], 0);  
     dup2(pipes[(2*i)+1],1); 
     } 
     for(int j = 0; j < numPipes*2;j++) 
     close(pipes[j]); 
     execvp(pipeCommands[i][0], pipeCommands[i].data()); ///pipeCommands is a vector<vector<char*>> 
     perror("exec failed"); 
     return EXIT_SUCCESS; 
    } 
    else  /// The parent 
    { 
     for(int j = 0; j <numPipes*2;j++) 
      close(pipes[j]); 
     for(int k = 0; k < numCommands; k++) 
     waitpid(pid2[k],nullptr,0); 
    } 
} 
+0

Montrez votre code réel, vous perdez du temps tout le monde en affichant un faux code. –

+0

J'espère que cela aide. –

+1

@LeifChipman Compte tenu du nouveau code que vous avez posté, quelle est l'erreur? –

Répondre

1

Votre indexation dans le tableau pipes est un peu problématique. Pour sort file.txt | head | wc Je suppose que numPipes est 2. Passons par votre boucle for pour chaque valeur de i.

i == 0

dup2(pipes[1], 1); // Send stdout to pipes[1] 

i == 1

dup2(pipes[2*(i-1)], 0); // dup2(pipes[0], 0), stdin from pipes[0] 
dup2(pipes[(2*i)+1],1); // dup2(pipes[3], 1), stdout to pipes[3] 

i == 2

dup2(pipes[2*(numCommands-1)-1], 0); //dup2(pipes[3], stdin from pipes[3] 

En d'autres termes, tout processus de sortie standard 0 va à une impasse. Le deuxième processus ne lira jamais à partir de sa sortie standard. Donc la déclaration de débogage que vous mettez là (cout == stdout, souvenez-vous) sera également perdue.

+0

Je doute fortement que ce soit le problème, car il ne sera même pas compiler avec cette ligne comme écrit. –

+0

Je en ai besoin à l'intérieur de la boucle pour que je puisse débiter un nombre arbitraire de processus enfants. –

+0

@LeifChipman Si vous essayez de l'utiliser pour garder une trace des pids, il sortira hors de la portée après la sortie de la boucle for, vous aurez perdu cette information. Si le processus parent bloque jusqu'à ce que l'enfant ait fini, vous n'avez pas besoin d'un tableau, un seul pid_t fera l'affaire. –