Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Именованные пайпы


Автор: Mephisto 18.6.2011, 15:24
Добрый день. Заметил вот http://habrahabr.ru/blogs/programming/122108/ статью.
В ней есть простейший пример работы с именованными пайпами. У меня возник некоторый вопрос по работе этого кода:
Код

#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" появляется только после появления данных.

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

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

Автор: Mephisto 19.6.2011, 00:15
ChihPih, понятно.

А есть возможность после получения данных снова перейти в блокирующий режим?

Автор: svlary 19.6.2011, 06:44
Цитата(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 типов. 

Автор: Mephisto 25.6.2011, 11:24
svlary, понял. Спасибо )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)