Mar*_* L. 5 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));
}
Run Code Online (Sandbox Code Playgroud)
非阻塞写入工作完美。
另一方面,我打开 FIFO 进行读取并执行相同的 fcntl() 以使 read() 非阻塞。
我现在想在写入端进行几个(cpu 密集型)计算,但前提是有一个读者。
因此,我需要在写入端找到一种方法,以检测 FIFO 是否已打开以在其他地方读取。
有谁知道如何实现这一目标?
小智 0
我现在想在写入端进行几次(CPU 密集型)计算,但前提是附加了读取器。
为此,您可以简单地创建一个套接字,当消费者连接到它时,做一些工作并写回。
但我认为更好的解决方案是在消费者连接(或打开 FIFO)之前为消费者准备好计算结果。但如果工作没有被消耗,你不希望生产者工作。因此,定义 N,即您愿意保留可供消费的工作结果的数量,并让生产者(或多个生产者)工作并将结果保存在大小为 N 的队列中,直到队列满为止。
您可以使用线程来实现这一点,一个线程侦听连接,从队列中弹出并写入消费者,一个或多个生产者线程工作并推送到队列。
或者您可以使用POSIX 消息队列来避免线程问题。创建一个大小为 N 的队列,独立的生产者(用不同语言编写的多个进程)可以将其推送到队列,直到队列满,然后从队列中弹出多个独立的消费者。