The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Полнодуплекстый FIFO в Linux"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Полнодуплекстый FIFO в Linux"  
Сообщение от gyn61 (ok) on 01-Июл-06, 23:18 
Здравствуйте.
Как сделать полнодуплексный fifo в Linux.
Есть тестовая программа test.cpp:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


int main(int argc, char **argv)
{
  int fd, c;
  if (argc < 2 || (fd = open("fifo", O_RDWR | O_NONBLOCK)) == -1)
    return 1;
  while (true) {
    if (random() % 100000 == 0)
      write(fd, argv[1], 1);
    if (random() % 50000 == 0 && read(fd, &c, 1) == 1)
      write(1, &c, 1);
  }
  return 0;
}

Делаем с одного терминала:

$ mkfifo fifo
$ ./tets 1

С другого терминала:

$ ./test 2

Из вывода на обоих терминалах видно что каждый процесс читает с fifo как свои так и чужие данные. Я понимаю что это соответствует стандарту POSIX но хотелось бы чтобы каждый из процессов читал только чужие данные. Как это сделать? Данные пишутся и читаются совершенно асинхронно - какую-либо синхронизацию не предлагать. Не предлагать также использовать два fifo.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Полнодуплекстый FIFO в Linux"  
Сообщение от perece on 03-Июл-06, 19:22 
>Как сделать полнодуплексный fifo в Linux.
[...]
>Из вывода на обоих терминалах видно что каждый процесс читает с fifo
>как свои так и чужие данные. Я понимаю что это соответствует
>стандарту POSIX но хотелось бы чтобы каждый из процессов читал только
>чужие данные.
>Как это сделать? Данные пишутся и читаются совершенно асинхронно - какую-либо синхронизацию не предлагать. Не предлагать также использовать два fifo.
никак. "полнодуплексный" предполагает наличие двух буферов - для передачи в одном направлении и для передачи в обратном. пайп - не важно, именованый или нет, - это один буфер. и баста.
как вариант, можешь использовать сокет (AF_UNIX), он таки как раз двунаправленый. но там код буде посложнее (эт в тему "синхронизацию не предлагать". если нужно что-то, что не сложней парового плуга, то два пайпа - единственный выход).

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. "Re: Полнодуплекстый FIFO в Linux"  
Сообщение от tomcat5 (ok) on 07-Июл-06, 16:23 
чувак, соображай что говоришь
fifo это файл, любой процесс (с правами) может открыть и читать содержимое, только данные при этом выдаются "с концами", т.е. очредь "первым вошел - первым вышел"

Поэтому не бейся о стену. Реши проблему др. способом.
Например очередь сообщений, где один пишет сообщения с типом "1", другой с типом "2"
, и соответственно второй читает только сообщения первого(тип "1") и наоборот.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "Полнодуплекстый FIFO в Linux"  
Сообщение от NuINu (ok) on 14-Июл-06, 16:03 
>Здравствуйте.
>Как сделать полнодуплексный fifo в Linux.
>Есть тестовая программа test.cpp:

>- какую-либо синхронизацию не предлагать. Не предлагать также использовать два fifo.
>

Объясни пожалуйста, почему тебе два фифо не нравятся?

но решение в принципе есть, используй сокеты юникс домена.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру