gpt4 book ai didi

c - 非阻塞 FIFO : detect if a reader exists?

转载 作者:太空狗 更新时间:2023-10-29 15:42:11 28 4
gpt4 key购买 nike

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

有人知道如何实现吗?

最佳答案

I now would like to make several (cpu-intensive) calculations on the write side, but ONLY if there is a reader attached.

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

关于c - 非阻塞 FIFO : detect if a reader exists?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14557910/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com