В C / C ++ я хочу писать в один и тот же канал несколько раз - PullRequest
2 голосов
/ 14 марта 2011

У меня есть программа, которая создает каналы между двумя процессами. Один процесс постоянно следит за выходом другого, и при обнаружении определенного вывода он передает данные через другой канал с помощью функции write(). Проблема, с которой я столкнулся, заключается в том, что содержимое канала не попадает в поток stdin другого процесса, пока я close() не передает канал. Я хочу, чтобы эта программа бесконечно зацикливалась и реагировала каждый раз, когда встречается с выводом, который она ищет. Есть ли способ отправить входные данные другому процессу, не закрывая канал?

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

Ответы [ 3 ]

4 голосов
/ 14 марта 2011

Взгляните на использование fflush .

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

Как вы читаете другой конец?Вы ожидаете полных строк?Вы не отправляете завершающие NUL в размещенном вами фрагменте.Возможно, отправка strlen (string) +1 байт исправит это.Трудно сказать, не видя код.

1 голос
/ 14 марта 2011

Используйте fsync. http://pubs.opengroup.org/onlinepubs/007908799/xsh/fsync.html

С http://www.delorie.com/gnu/docs/glibc/libc_239.html: Как только запись возвращается, данные ставятся в очередь для записи и могут быть сразу же прочитаны, но они не обязательно сразу записываются в постоянное хранилище. Вы можете использовать fsync, когда вам необходимо убедиться, что ваши данные постоянно хранятся, прежде чем продолжить. (Для системы более эффективно группировать последовательные записи и делать их все одновременно, когда это удобно. Обычно они всегда записываются на диск в течение минуты или меньше.) Современные системы предоставляют другую функцию fdatasync, которая гарантирует целостность только для файла данные и, следовательно, быстрее. Вы можете использовать открытый режим O_FSYNC, чтобы при записи всегда сохранялись данные на диск перед возвратом.

...