1

我创建了一个 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 的描述符)
但是我真的不喜欢它,它看起来很做作。有更好的方法吗?

4

1 回答 1

0

通常,如果您没有使用 O_NONBLOCK 标志打开 fifo,则读取块直到数据可供读取。所以“睡眠(2);” 声明是不必要的。此外,仍然需要“if(read > 0)”检查,因为 fifo 的写入端已关闭或 read 调用已返回,因为它已被信号中断 (errno = EINTR)。

于 2016-05-01T06:40:00.553 回答