2016-03-06 3 views
-1

Это образец моего кода для некоторых трубопроводов, которые я хочу сделать. Проблема в том, что pid2 [0] не предоставляет мне дочерний процесс. Как это исправить? pid2 [1] и pid2 [2] и т. д. предоставляют родителям дочерние элементы.Looping fork()

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

Показать ваш реальный код, вы тратите время каждого, публикуя поддельный код. –

+0

Надеюсь, это поможет. –

+1

@LeifChipman Учитывая новый код, который вы опубликовали, какая ошибка? –

ответ

1

Ваше индексирование в pipes массив немного проблематично. Для sort file.txt | head | wc Я предполагаю, что numPipes равно 2. Пройдем через цикл for для каждого значения i.

я == 0

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

я == 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] 

я == 2

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

Другими словами, любой стандартный вывод из процесса 0 собирается на тупик. Второй процесс никогда не будет считываться со стандартного вывода. Таким образом, заявление отладки, которое вы там ввели (cout == stdout, помните), также будет потеряно.

+0

Я очень сомневаюсь, что это проблема, так как она даже не будет компилироваться с этой строкой, как написано. –

+0

Мне нужно это внутри цикла, чтобы я мог развить произвольное количество дочерних процессов. –

+0

@LeifChipman Если вы пытаетесь использовать его для отслеживания pids, он выйдет за пределы области после выхода из цикла for, вы потеряете эту информацию. Если родительский процесс блокируется до тех пор, пока ребенок не будет завершен, вам не понадобится массив, который сделает один pid_t. –