Как я могу записать больше значений в канал и прочитать их? - PullRequest
2 голосов
/ 20 июля 2011

Я пишу программу на c ++ под Linux, где дочерний процесс должен записать два длинных значения в канал, а родительский процесс должен их прочитать. До сих пор мне только удается настроить два (именованных) канала для этого и записать каждый из них записью (fd1, & value1, sizeof (long)) и прочитать его чтением (fd1, & value1, sizeof (long)). Лучше было бы использовать только одну трубу для обоих, но я не мог понять, как это сделать.

Я пытался:

write(fd1,&value1,sizeof(long));

write(fd1,&value2,sizeof(long));

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

Я был бы очень рад, если бы кто-нибудь дал мне подсказку, как это реализовать.

Возможное РЕШЕНИЕ: я записал все значения в массив (потому что я знал, сколько их), тогда мне понадобился только один вызов wire / read.

Ответы [ 2 ]

3 голосов
/ 20 июля 2011

Должно работать нормально.Вот очень простой пример.В основном это копия кода из примера на странице руководства .

int main(int argc, char *argv[])
{
   int fd[2];
   pid_t cpid;
   int ret;
   int val = 0;
   if (pipe(fd) == -1)
      {
      perror("pipe"); exit(EXIT_FAILURE);
      }
   cpid = fork();
   if (cpid == -1)
      {
      perror("fork"); exit(EXIT_FAILURE);
      }
   if (cpid == 0) { 
      // close write end of pipe in child
      close(fd[1]);   
      ret = read(fd[0], &val, sizeof( val ));
      printf( "1: result = %d, value = %d\n", ret, val );
      ret = read(fd[0], &val, sizeof( val ));
      printf( "2: result = %d, value = %d\n", ret, val );
      close(fd[0]);
      _exit(EXIT_SUCCESS);
      } 
   else {
      // close read end of pipe in parent
      close(fd[0]); 
      val = 42;
      if ( write(fd[1], &val, sizeof(val)) < 0 )
         perror( "write" );
      val++;
      if ( write(fd[1], &val, sizeof(val)) < 0 )
         perror( "write" );
      close(fd[1]); 
      wait(NULL); 
      exit(EXIT_SUCCESS);
      }
}
1 голос
/ 20 июля 2011

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

...