即使我读取了所有内容,在FIFO上打开的QSocketNotifier也会一直启动

QSocketNotifier opened on a FIFO keeps firing even if I read everything

本文关键字:QSocketNotifier 启动 一直 FIFO 读取      更新时间:2023-10-16

在我的代码中,我open是一个FIFO(用mkfifo创建(,然后我继续使用QSocketNotifier来接收传入数据的通知,并在数据到达时读取它。

// create the FIFO
if(!mkfifo(SERIAL_FIFO, 0600)) {
// nonblocking open (even open itself would block until a first write)
in_fifo = ::open(SERIAL_FIFO, O_RDONLY | O_NONBLOCK);
if(in_fifo >= 0) {
// create notifier
in_fifo_notifier = new QSocketNotifier(in_fifo, QSocketNotifier::Read, this);
connect(&*in_fifo_notifier, &QSocketNotifier::activated,
this, [this](QSocketDescriptor /*socket*/, QSocketNotifier::Type /*type*/){
// copy all the available data
char buf[4096];
for(;;) {
ssize_t rl = ::read(in_fifo, buf, sizeof(buf));
if(rl <= 0) break;
::write(out_fd, buf, rl);
}
});
}

问题是,每当有人在管道的另一端写入时,信号就会不断被激活(与100%的CPU使用率相关(,即使每次我读取所有数据时也是如此。问题出在哪里?

最终,这只是这里描述的问题的一个变体,因为Qt在后台使用select/epoll机制来实现QSocketNotifier。将FIFO作为O_RDWR打开可修复此问题。