使用非阻塞FIFO作为环形缓冲区?

时间:2013-01-26 14:47:08

标签: c nonblocking fifo circular-buffer

我创建了一个FIFO,我可以用这种方式进行非阻塞写入:

// others, searching for a non-blocking FIFO-writer may copy this ;-)
mkfifo("/tmp/myfifo", S_IRWXU);
int fifo_fd = open("/tmp/myfifo", O_RDWR);
fcntl(fifo_fd, F_SETFL, fcntl(fifo_fd, F_GETFL) | O_NONBLOCK);

// and then in a loop:
LOGI("Writing into fifo.");
if (write(fifo_fd, data, count) < 0) {
    LOGE("Failed to write into fifo: %s", strerror(errno));
}

非阻塞写入工作完美,但由于我的日志记录,我可以看到:

(..)
Writing into fifo.
Writing into fifo.
Writing into fifo.
Failed to write into fifo: Try again    
Writing into fifo.
Failed to write into fifo: Try again    
Writing into fifo.
Failed to write into fifo: Try again

创建像cat /tmp/myfifo > foo.out这样的读者后,错误就消失了。

我认为FIFO就像一个环形缓冲区,并在缓冲区满时丢弃第一个写入的字节。但是现在我已经知道它会阻塞/阻止新字节,直到读取第一个字节为止。

有没有人知道我可以做的一个简单的其他方法或附加操作,以便FIFO的行为类似于环形缓冲区?

0 个答案:

没有答案