FIFO не блокируется на чтение - PullRequest
1 голос
/ 31 августа 2011

Почему следующая программа не блокируется при втором read вызове?

int pid = fork();

if(pid) {
    int fifo = open("testfifo", O_RDWR);

    char buf[20];

    while(1) {
        read(fifo, buf, 10);
        puts(buf);
    }

} else {
    int fifo = open("testfifo", O_WRONLY);

    write(fifo, "teststring", 10);

    close(fifo);
}

return 0;

Второй read вызов продолжает возвращаться 0, даже если fifo становится пустым, и он должен блокироваться при вызове read.

Я что-то упустил?

Операционная система Windows, и канал был создан с mknod testfifo p.

Ответы [ 2 ]

4 голосов
/ 01 сентября 2011

Из другого вопроса stackoverflow я обнаружил, что я должен каждый раз открывать и закрывать канал «сервера», в данном случае канал родительского процесса; так вот правильный код:

int pid = fork();

if(pid) {
    char buf[20];

    while(1) {

        int fifo = open("testfifo", O_RDWR);
        read(fifo, buf, 15);
        close(fifo);

        puts(buf), fflush(stdout);
    }
} else {
    int fifo = open("testfifo", O_WRONLY);
    write(fifo, "teststring", 15);
    close(fifo);
}
0 голосов
/ 31 августа 2011

Вы не закрыли файл

РЕДАКТИРОВАТЬ: удалили что-то неловкое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...