Использование именованных каналов в одном процессе - PullRequest
3 голосов
/ 12 февраля 2010

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

#include <stdio.h>
#include <fcntl.h>
#include <signal.h>

void sigint(int num)
{
    int fd = open("np", O_WRONLY);
    write(fd, "y", 1);
    close(fd);
}

main()
{
    char ch[1];
    int fd;

    mkfifo("np", 0666);

    signal(SIGINT, sigint);

    fd = open("np", O_RDONLY);

    read(fd, ch, 1);

    close(fd);

    printf("%c\n", ch[0]);
    return;
}

Я хочу, чтобы основной блок блокировался, пока что-то не записано в канал. Проблема в том, что обработчик сигнала sigint () также блокируется после открытия канала. Это должно произойти, учитывая, что канал уже открыт для чтения ранее в main ()?

Ответы [ 2 ]

3 голосов
/ 12 февраля 2010

Вы блокируете в open (), открывая fifo для чтения блоков, пока кто-то не откроет его для записи.

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

обработчик сигнала работает в том же потоке, что и main (), так что вы получите тупик. Никто не сможет открыть FIFO.

Вы можете проверить, что происходит, запустив программу под strace.

1 голос
/ 12 февраля 2010

со страницы руководства:

Открытие FIFO для нормального чтения блокирует, пока не открывается какой-то другой процесс тот же FIFO для письма и порок наоборот.

и

Процесс может открыть FIFO в неблокирующий режим. В этом случае, открытие только для чтения будет успешным даже если никто не открыл на запись сторона еще; открытие только для записи будет ошибка ENXIO (нет такого устройства или адрес), если другой конец не имеет уже был открыт.

В Linux открытие FIFO для чтения и пиши получится как в блокирующий и неблокирующий режим. POSIX оставляет это поведение неопределенным. это может быть использован для открытия FIFO для записи пока нет доступных читателей. Процесс, который использует оба конца соединение для общения с собой следует быть очень осторожным избегать тупиков.

...