【问题标题】:QSocketNotifier opened on a FIFO keeps firing even if I read everything即使我阅读了所有内容,在 FIFO 上打开的 QSocketNotifier 也会继续触发
【发布时间】:2020-10-29 22:59:51
【问题描述】:

在我的代码中,我 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);
            }
        });
    }

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

【问题讨论】:

    标签: c++ linux qt unix mkfifo


    【解决方案1】:

    最终,这只是here 描述的问题的一种变体,因为 Qt 底层使用 select/epoll 机制来实现 QSocketNotifier。以O_RDWR 身份打开 FIFO 可以解决问题。

    【讨论】:

      猜你喜欢
      • 2021-11-23
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      相关资源
      最近更新 更多