Есть ли простой способ очистки трубы в C - PullRequest
4 голосов
/ 25 февраля 2012

У меня есть канал, который используют все мои дочерние процессы, но перед тем, как ребенок использует канал для связи с родителем, мне нужно очистить его, чтобы родительский объект правильно прочитал его. Есть ли в C простая функция для этого?

1 Ответ

8 голосов
/ 25 февраля 2012

Способ «очистки» канала - чтение из него, пока буфер не опустеет. Это тебе не поможет. Я предполагаю, что ваша настоящая проблема заключается в том, что родитель может читать данные, которые смешаны из нескольких клиентов. Есть два простых решения вашей проблемы.

  1. Всегда пишите сообщения длиной менее PIPE_BUF байт и делайте это за один вызов write. Это обеспечит атомарную запись в канал.

  2. Используйте отдельный канал для каждого дочернего процесса. На стороне сервера либо используйте потоки, либо используйте неблокирующий ввод-вывод с select или poll. Эквивалентно, вы можете использовать доменный сокет Unix и подключить к нему каждый клиент (на самом деле это просто другой способ создания отдельных каналов).

...