2015-10-28 3 views
0

Я должен реализовать программу, в которой процесс отправляет полученные данные из родительского процесса в дочерний процесс, ждет, пока ребенок отправит обработанные данные обратно, а затем возвратит обработанные данные в дочерний процесс (так, например, в случае 4 процессы потока данных будут выглядеть так: P1->P2->P3->P4->P3->P2->P1). Для средств межпроцессного общения мне нужно использовать трубы. Вот подход, который я планировал взять:Связь между дочерними процессами ребенка - это кипит трубы, открытые ОК?

./child

// Assert argv contains 2 pipe descriptors - for reading 
// from parent and for writing to parent, both of type char[] 

// I'm not handling system errors currently 

int main(int argc, char *argv[]) { 
    int read_dsc, write_dsc; 
    read_dsc = atoi(argv[1]); 
    write_dsc = atoi(argv[2]); 
    char data[DATA_SIZE]; 
    read (read_dsc, data, DATA_SIZE - 1); 
    close (read_dsc); 
    // Process data... 
    (...) 
    // Pass processed data further 
    int pipeRead[2]; // Child process will read from this pipe 
    int pipeWrite[2]; // Child process will write into this pipe 
    pipe(pipeRead); 
    pipe(pipeWrite); 
    switch(fork()) { 
     case 0: 
      close (pipeRead[1]); 
      close (pipeWrite[0]); 
      char pipeReadDsc[DSC_SIZE]; 
      char pipeWriteDsc[DSC_SIZE]; 
      printf (pipeReadDsc, "%d", pipeRead[0]); 
      printf (pipeWriteDsc, "%d", pipeWrite[1]); 
      execl ("./child", "child", pipeReadDsc, pipeWriteDsc, (char *) 0); 
     default: 
      close(pipeRead[0]); 
      close(pipeWrite[1]); 
      wait(0); 
      read (pipeWrite[0], data, DATA_SIZE - 1); 
      close (pipeWrite[0]); 
      // Pass data to parent process 
      write (write_dsc, data, DATA_SIZE - 1); 
      close (write_dsc); 
    } 
} 

описания Высокого уровня моего решения заключается в следующем: сделать 2 трубу, один для записи дочернего процесса, один для чтения из дочернего процесса. Подождите, пока завершится процесс дочернего процесса, а затем прочитайте из канала чтения и передайте данные родителям.

Проблема в том, что я не знаю, правильно ли этот подход. Я где-то читал, что не закрытие неиспользуемых труб является ошибкой, поскольку она загромождает дескрипторы файлов ОС и не должно быть много открытых труб одновременно. Здесь, однако, мы собираем незакрытую трубу для чтения из дочернего элемента и потенциально, если есть процессы n, есть n открытые трубы, когда номер процесса n обрабатывает его данные (все родительские процессы ждут возврата данных). Однако я не вижу другого способа решить эту проблему ...

Итак - это мое решение правильно? Если это не так, как мне подойти к этой проблеме?

ответ

1

Да, ваше решение верно. Но есть проблемы в вашем коде:

  • случае 0 является ребенком, вы будете пользоваться в перенаправлении концов труб на стандартный ввод и вывод (используйте dup или dup2); передача идентификаторов идентификатора ребенку является странной.
  • по умолчанию является родительским, поэтому вам необходимо write до read ing.

«Не закрытие неиспользуемых труб является ошибкой»: это не ошибка, но может вызвать проблемы (обнаружение конца сообщения было бы трудным или невозможным), но кажется, что вы правильно закрываете все не полезные трубы заканчивается в вашем коде, так что хорошо. В общем, количество открытых труб на самом деле не является проблемой, так как открытые файлы ...

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