Напишите в программу взаимоблокировки каналов - PullRequest
2 голосов
/ 12 мая 2010

У меня возникла проблема в моей программе, использующей каналы.

Я использую каналы вместе с fork / exec для отправки данных другому процессу

Что у меня есть, примерно так:

//pipes are created up here

if(fork() == 0) //child process
{
  ...
  execlp(...);
}
else
{
  ...
  fprintf(stderr, "Writing to pipe now\n");
  write(pipe, buffer, BUFFER_SIZE);
  fprintf(stderr, "Wrote to pipe!");
  ...
}

Это нормально работает для большинства сообщений, но когда сообщение очень большое, запись в канал заходит в тупик.

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

Кто-нибудь может мне помочь?

1 Ответ

3 голосов
/ 12 мая 2010

Вам нужно закрыть конец чтения канала в процессе выполнения записи. ОС будет сохранять данные, записанные в канал в буфере канала, до тех пор, пока все процессы , у которых открыт конец чтения канала, фактически не прочитают то, что там есть.

...