Многократное чтение / запись с каналами в C - PullRequest
1 голос
/ 07 марта 2011

Я видел много примеров каналов, которые читают от потомка и пишут родителю или наоборот.Например:

    /* this example shows how unnamed pipes may be used */

#include <unistd.h>
#include <stdio.h>
#include <errno.h>

int main() {
int ret_val;
int pfd[2];
char buff[32];
char string1[]="String for pipe I/O";

ret_val = pipe(pfd);                 /* Create pipe */
if (ret_val != 0) {             /* Test for success */
  printf("Unable to create a pipe; errno=%d\n",errno);

  exit(1);                         /* Print error message and exit */
}
if (fork() == 0) {
   /* child program */
   close(pfd[0]); /* close the read end */
   ret_val = write(pfd[1],string1,strlen(string1)); /*Write to pipe*/
   if (ret_val != strlen(string1)) {
      printf("Write did not return expected value\n");
      exit(2);                       /* Print error message and exit */
   }
}
else {
   /* parent program */
   close(pfd[1]); /* close the write end of pipe */
   ret_val = read(pfd[0],buff,strlen(string1)); /* Read from pipe */
   if (ret_val != strlen(string1)) {
      printf("Read did not return expected value\n");
      exit(3);                       /* Print error message and exit */
   }
   printf("parent read %s from the child program\n",buff);

}
exit(0);
}

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

1 Ответ

2 голосов
/ 07 марта 2011

Вам нужны два (набора) каналов, один из которых пишет родитель, а дочерний читает, а другой - дочерний и родитель читает.

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

...