Я должен реализовать программу, в которой процесс отправляет полученные данные из родительского процесса в дочерний процесс, ждет, пока ребенок отправит обработанные данные обратно, а затем возвратит обработанные данные в дочерний процесс (так, например, в случае 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
обрабатывает его данные (все родительские процессы ждут возврата данных). Однако я не вижу другого способа решить эту проблему ...
Итак - это мое решение правильно? Если это не так, как мне подойти к этой проблеме?