非阻塞FIFO:检测读卡器是否存在?

时间:2013-01-28 08:10:21

标签: c nonblocking fifo

我创建了一个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));
}

非阻塞写入工作非常完美。

另一方面,我打开FIFO进行读取并执行相同的fcntl()以使read()无阻塞。

我现在想在写入端进行几次(cpu密集型)计算,但是只有连接了一个阅读器。

因此我需要在写入端找到一种方法,以检测FIFO是否在其他地方打开以便读取。

有谁知道如何实现这个目标?

1 个答案:

答案 0 :(得分:0)

  

我现在想在写入端进行几次(cpu密集型)计算,但是只有连接了一个阅读器。

为此你可以简单地创建一个套接字,当消费者连接它时,做一些工作并回写 但我认为更好的解决方案是在连接(或打开FIFO)之前为消费者准备好计算结果。但如果没有消耗工作,你不希望生产者工作。因此,定义N,您愿意继续使用的工作结果数量,让生产者(或生产者)工作并将结果保存在大小为N的队列中,直到它满了为止。
您可以使用线程实现此功能,一个线程侦听连接,从队列中弹出并写入使用者以及一个或多个生产者线程正在工作并推送到队列。 或者您可以使用POSIX message queues来避免线程化。创建一个大小为N的队列,独立的生产者(用不同语言编写的多个进程)可以推送到队列直到它完整,并从中弹出多个独立的消费者。