5

我创建了一个 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 是否已打开以供在其他地方读取。

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

4

1 回答 1

0

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

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

于 2013-01-29T13:09:27.120 回答