在没有忙于等待linux的情况下收听fifo(C linux)

时间:2016-04-30 13:52:19

标签: linux mkfifo busy-waiting

我已经创建了一个FIFO(使用mkfifo()),我需要等到某个进程多次将数据写入其中。我已经写了以下代码:(忽略不好的风格,保持示例简明扼要)

int count = 0, read = 0;
while(count < 2) {
    read = read(fd, buf, BUFFER_SIZE);
    if(read > 0) {
        //do work...
        count++;
    }
}

为了避免忙碌等待,我添加了以下内容:

int count = 0, read = 0;
while(count < 2) {
    sleep(2);
    read = read(fd, buf, BUFFER_SIZE);
    if(read > 0) {
        //do work...
        count++;
    }
}

(fd是FIFO的描述符)
然而我真的不喜欢它,它看起来很人为。有没有更好的方法呢?

1 个答案:

答案 0 :(得分:0)

通常情况下,如果打开带有O_NONBLOCK标志的fifo,则读取块直到数据可供读取。所以“睡觉(2);”声明没有必要。此外,仍然需要“if(read&gt; 0)”检查,因为fifo的写入结束已经关闭或者读取调用已经被返回,因为它已被信号中断(errno = EINTR)。