2015-02-25 2 views
4

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

int main(int argc, char *argv[]){ 
    int i; 
    int num_children; 
    pid_t pid; 

    num_children= 3; 

    int fd[num_children][2];  //PIPES 

    for (i=0; i<num_children; i++) 
    { 
     if (pipe(fd[i]) == -1) 
     { 
      printf("couldnt create the pipe\n"); 
      exit(EXIT_FAILURE); 
     } 
    } 


    for (i=0; i<num_children; i++) 
    { 
     pid = fork(); 
     if (pid == -1) 
     { 
      printf("couldnt create child process %i\n",i); 
      exit(EXIT_FAILURE); 
     } 

     if (pid == 0) 
     {       //this is child process 
      close(fd[i][1]);   //closing fd[1] the write end of the pipe 
      int received; 
      node *list = NULL; 
      while (read(fd[i][0], &received, sizeof(int)) > 0) 
      { 
       list = insert(list, received); 
       printf("Process %i got the number: %i\n",i,received); //this part is working perfect 
      } 

      printf("Im process %i here is my list: \n",i); //i couldnt get any output from here 
      printList(list); 

      close(fd[i][0]); 
      exit(EXIT_SUCCESS); 
     }  
    } 


    for (i=0; i<num_children; i++) //closing the read end of pipe for parent 
    { 
     close(fd[i][0]); 
    } 

    int number; 
    int mod; 
    FILE *fileIn = fopen ("<file directory>","r"); 
    while(fscanf(fileIn, "%i", &number)>=0) 
    { 
     mod = number % num_children; 
     write(fd[mod][1], &number, sizeof(int)); 
    } 

    for (int i=0; i<num_children; i++) 
    { 
     if(close(fd[i][1])==0) 
     { 
      printf("cant close the pipe"); 
      //tried to catch errors, but pipes are closing with no problem i think 
     } 
    } 

    return 0; 

Я пытался увидеть, если дети процесс ждать в то время как (читать) петлю, но когда я закрыть конец записи труб от родительского процесса они должны оставить петлю.

+0

Вы уверены, что это правильный способ объявить массив: 'Int FD [num_children] [2];'? –

+0

yes Я предполагаю: type arrayName [x] [y]; –

+0

Никогда не приходилось использовать массивы переменной длины. Стандарт чтения на них сейчас. –

ответ

2

Возможно, вы думаете, что определенный конкретный pipe[2] разделяет родительский элемент и соответствующий дочерний процесс. Это правда ... Однако он также разделяется всеми остальными процессами, которые вы создаете на этом пути, и потому что он открыт, эти другие дочерние процессы также наследуют его как открытые.

Делать это в начале вашего ребенка проверки Pid работал для меня:

if (pid == 0) { 
    int j; 
    for (j = 0; j < num_children; j++) { 
     if (j != i) { 
      close(fd[j][0]); 
      close(fd[j][1]); 
     } 
    } 
    ... 
} 
+0

Вы правы, другие концы труб должны быть закрыты. Огромное спасибо :) –

0

Я подозреваю, что чтение из трубы через:

время (чтение (FD [I] [0], & получил, SizeOf (INT))> 0)

блокируется/haulted пока данные не будут доступны на трубе. Если это так, это объясняет отсутствие ответа от вашего кода после этого момента.

Смежные вопросы