在linux(C linux)中侦听fifo而不忙于等待

在linux(C linux)中侦听fifo而不忙于等待,linux,mkfifo,busy-waiting,Linux,Mkfifo,Busy Waiting,我已经创建了一个FIFO(使用mkfifo()),需要等待某个进程多次将数据写入其中。我已经编写了以下代码:(忽略糟糕的样式,这是为了保持示例简洁) int count=0,read=0; 而(计数0){ //做工作。。。 计数++; } } 为了避免繁忙的等待,我添加了以下行: int count = 0, read = 0; while(count < 2) { sleep(2); read = read(fd, buf, BUFFER_SIZE); if(r

我已经创建了一个FIFO(使用mkfifo()),需要等待某个进程多次将数据写入其中。我已经编写了以下代码:(忽略糟糕的样式,这是为了保持示例简洁)

int count=0,read=0;
而(计数<2){
读取=读取(fd、buf、缓冲区大小);
如果(读取>0){
//做工作。。。
计数++;
}
}
为了避免繁忙的等待,我添加了以下行:

int count = 0, read = 0;
while(count < 2) {
    sleep(2);
    read = read(fd, buf, BUFFER_SIZE);
    if(read > 0) {
        //do work...
        count++;
    }
}
int count=0,read=0;
而(计数<2){
睡眠(2);
读取=读取(fd、buf、缓冲区大小);
如果(读取>0){
//做工作。。。
计数++;
}
}

(fd是FIFO的描述符)
不过我真的不喜欢它,它看起来很做作。有更好的方法吗?

通常,如果没有使用O_NONBLOCK标志打开fifo,请读取块,直到数据可供读取为止。所以“睡眠(2);”这句话是没有必要的。此外,由于fifo的写入端已关闭或读取调用因信号(errno=EINTR)中断而返回等情况,仍然需要进行“if(read>0)”检查。

通常,如果未使用O_NONBLOCK标志打开fifo,则读取块直到数据可用于读取。所以“睡眠(2);”这句话是没有必要的。此外,由于fifo的写入端已关闭或读取调用因信号(errno=EINTR)中断而返回等情况,仍然需要进行“if(read>0)”检查。

这是一种非常常见的情况:使用
select()
阻塞(等待)除非一个或多个文件描述符有东西要从它们那里
读取
read=read(…)
否则不要认为这会起作用。这是一种非常常见的情况:使用
select()
阻止(等待)直到一个或多个文件描述符有东西要从它们那里
读取。
read=read(…)
不要认为这会起作用。
int count = 0, read = 0;
while(count < 2) {
    sleep(2);
    read = read(fd, buf, BUFFER_SIZE);
    if(read > 0) {
        //do work...
        count++;
    }
}