Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Именованные пайпы 
V
    Опции темы
Mephisto
Дата 18.6.2011, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: нет
Всего: 34



Добрый день. Заметил вот эту статью.
В ней есть простейший пример работы с именованными пайпами. У меня возник некоторый вопрос по работе этого кода:
Код

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

#define NAMEDPIPE_NAME "/tmp/my_named_pipe"
#define BUFSIZE        50

int main (int argc, char ** argv) {
    int fd, len;
    char buf[BUFSIZE];

    if ( mkfifo(NAMEDPIPE_NAME, 0777) ) {
        perror("mkfifo");
        return 1;
    }
    printf("%s is created\n", NAMEDPIPE_NAME);

    if ( (fd = open(NAMEDPIPE_NAME, O_RDONLY)) <= 0 ) {
        perror("open");
        return 1;
    }
    printf("%s is opened\n", NAMEDPIPE_NAME);

    do {
        memset(buf, '\0', BUFSIZE);
        if ( (len = read(fd, buf, BUFSIZE-1)) <= 0 ) {
            perror("read");
            close(fd);
            remove(NAMEDPIPE_NAME);
            return 0;
        }
        printf("Incomming message (%d): %s\n", len, buf);
    } while ( 1 );
}

После выполнения этого 
Код

echo 'Hello, my named pipe!' > /tmp/my_named_pipe

строка выводится в консоль.

Судя по выводу, после открытия пайпа у процесса забирается управления до появления данных в пайпе?
Потому как строка "%s is opened\n" появляется только после появления данных.

PM   Вверх
ChihPih
Дата 18.6.2011, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 3.12.2006

Репутация: нет
Всего: 22



Цитата(Mephisto @  18.6.2011,  18:24 Найти цитируемый пост)
Судя по выводу, после открытия пайпа у процесса забирается управления до появления данных в пайпе?

Все верно, по умолчанию все функции ввода/вывода работают с новым дескриптором в блокирующем режиме.


--------------------
www.info-x.org - информационный ресурс о ОС FreeBSD. Форум.
PM MAIL WWW Jabber   Вверх
Mephisto
Дата 19.6.2011, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: нет
Всего: 34



ChihPih, понятно.

А есть возможность после получения данных снова перейти в блокирующий режим?
PM   Вверх
svlary
Дата 19.6.2011, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(Mephisto @  19.6.2011,  00:15 Найти цитируемый пост)
можно после получения данных снова перейти в блокирующий режим? 

  Никуда ПЕРЕХОДИТЬ не нужно. Если Вы открыли файп в блокирующем режиме, он так и будет дальше работать, пока Вы его не закроете.
 
Поскольку в операторе 

Код

fd = open(NAMEDPIPE_NAME, O_RDONLY);


  Вы НЕ задали флаг работы в неблокирующем режиме, то это означает (по умолчанию). что системные вызовы на этот файловый дескриптор будут работать в блокирующем режиме.

  Наверное, Вы не обратили внимание на то, что у Вас ДВА  системных вызова работают с этим файловым дескриптором :
  • open - он блокируется до тех пор, пока какой-то другой процесс на другом "конце" пайпа не откроет его на запись.
  • read - он блокируется до тех пор, пока процесс-напарник не запишет в пайп данные.
Просто, так как Вы для тестирования, использовали процесс-напарник  

Код

echo 'Hello, my named pipe!' > /tmp/my_named_pipe


   то у Вас эти обе блокировки практически совпали по времени.  А если бы Вы запустили любую диалоговую программу на этот файловый дескриптор,  то увидели бы четкие моменты всех блокировок.

Добавлено через 4 минуты и 24 секунды
Цитата(Mephisto @  18.6.2011,  15:24 Найти цитируемый пост)
Заметил вот эту статью.

  В этой статье почему-то не упоминаются два IPC механизма :
  • Неименованные каналы (обычные) pipe
  • Системные очереди сообщений.

Причем последние бывают POSIX и System-V типов. 
PM MAIL   Вверх
Mephisto
Дата 25.6.2011, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: нет
Всего: 34



svlary, понял. Спасибо )
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0692 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.