2012-06-09 3 views
-1

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

Вот что я сделал:

У меня есть FIFO_FILE под названием "MYFILE". Процесс A пишет новую строку в MYFILE, а процесс B считывает из MYFILE и выводит строку для обработки вывода терминала B. Однако, если процесс B хочет написать новую строку в MYFILE (из того, что я понимаю о семафоре), процесс A будет заблокирован от чтения/записи до MYFILE, пока процесс B не закончит писать.

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

Единственный способ, я могу думать, это иметь два FIFO_FILEs. Но как добиться этой реализации? Или есть другой способ достичь?

Мне сказали использовать шаблон Consumer-Producer, но я не вижу, как это решит мою проблему.

Любая помощь будет отличной. Благодаря!!

ответ

-1

Предложение - вам действительно не нужны семафоры с именованными трубами, не так ли?

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

Вот несколько коротких учебник для использования именованных каналов с помощью скриптов оболочки на Linux:

+0

не очень. Но я думал использовать семафоры, чтобы предотвратить другой процесс записи/чтения. – user1420474

0

Предполагая, что какой-то * Nix среды этой не будет работать. Чтение/запись труб гарантированно будет атомарным, если они находятся под длиной PIPE_BUF. Наличие обоих процессов в одно и то же время в одном и том же случае не имеет смысла. Подумайте об этом, как писать в файл - зачем вам нужно вставлять содержимое двух независимых писем? Как бы вы поняли это?

Вы действительно должны изучить использование нескольких филосов. Даже тогда вам понадобится использовать многопоточные или неблокирующие FIFO и select или poll, чтобы достичь того, что, как я думаю, вы действительно хотите достичь.

+0

Я думал, что это двухсторонняя программа чата, потому что никто не блокируется при наборе сообщений, а не как один выдает что-то и ждет ответа от другого процесса. Но я обязательно посмотрю на «несколько FIFO» --- никогда не думал об этом термине, но спасибо! – user1420474

+0

Думаю, мы можем разговаривать друг с другом. Проблема с одним FIFO заключается в том, что оба процесса должны были бы открыть его как чтение/запись. Я подозреваю, что вы думаете, что читатель обязательно получит то, что написал писатель. Это не относится к FIFO. В зависимости от времени это весь возможный процесс, который A может записать в FIFO, а затем сразу же прочитать то, что он только что написал. Процесс Б никогда не увидит. С 2 FIFO один процесс читает 1 FIFO, а другой пишет ему. И наоборот со вторым FIFO.Или упростите свою жизнь и используйте сокеты домена unix, которые лучше подходят для этого. – Duck

Смежные вопросы