Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 读取fifo的最后一行_C_Unix_Fifo - Fatal编程技术网

C 读取fifo的最后一行

C 读取fifo的最后一行,c,unix,fifo,C,Unix,Fifo,情况如下:某些进程将行写入fifo文件(使用mkfifo创建)。在我的程序中的某个时刻,我想读取fifo中的最后一行,并丢弃所有其他行。仅当fifo中的行数少于一行时,该过程可能会阻塞 我想不出一个干净的方法来做这件事,有什么想法吗 编辑:写入过程永远不会停止将行写入fifo,我所说的最后一行是指我读取fifo时的最后一行。它不一定跟在EOF后面 我能想到的唯一方法是让程序(正在读取的程序)读取FIFO中的所有信息——也就是说,程序中的读取指针始终位于管道的末端。读取消息时,您会将其添加到消息的

情况如下:某些进程将行写入fifo文件(使用
mkfifo
创建)。在我的程序中的某个时刻,我想读取fifo中的最后一行,并丢弃所有其他行。仅当fifo中的行数少于一行时,该过程可能会阻塞

我想不出一个干净的方法来做这件事,有什么想法吗


编辑:写入过程永远不会停止将行写入fifo,我所说的最后一行是指我读取fifo时的最后一行。它不一定跟在EOF后面

我能想到的唯一方法是让程序(正在读取的程序)读取FIFO中的所有信息——也就是说,程序中的读取指针始终位于管道的末端。读取消息时,您会将其添加到消息的内部列表(即队列或类似内容)。您还将维护指向上次读取的消息的指针

因此,读取最后一行并丢弃所有其他行只需遵循指向最后一条消息的指针,如果需要,清除队列


这里的问题是内部队列可能会变大,并且需要对队列和最后一个消息指针进行并发控制。我会让FIFO阅读器在它自己的线程中除了听管道外什么也不做。当消息传入时,您需要锁定队列,添加新消息并更新最后一个消息指针,然后释放锁。确保在释放锁之前处理所有可用的传入消息。在执行处理的线程中,应该锁定队列以对其进行操作。请确保锁定队列的时间不超过绝对需要的时间,否则会出现性能问题。

我能想到的唯一方法是让程序(正在读取的程序)读取FIFO中的所有信息,也就是说,程序中的读取指针始终位于管道的末端。读取消息时,您会将其添加到消息的内部列表(即队列或类似内容)。您还将维护指向上次读取的消息的指针

因此,读取最后一行并丢弃所有其他行只需遵循指向最后一条消息的指针,如果需要,清除队列


这里的问题是内部队列可能会变大,并且需要对队列和最后一个消息指针进行并发控制。我会让FIFO阅读器在它自己的线程中除了听管道外什么也不做。当消息传入时,您需要锁定队列,添加新消息并更新最后一个消息指针,然后释放锁。确保在释放锁之前处理所有可用的传入消息。在执行处理的线程中,应该锁定队列以对其进行操作。确保锁定队列的时间不超过绝对必要的时间,否则会出现性能问题。

如果您主要担心的是读取将被阻塞,则以非阻塞方式打开FIFO。我假设您知道您在流中寻找什么,并且会简单地放弃以前的一切


您还可以使用类似“当有东西要读取管道时通知”的功能。

如果您主要担心的是读取会阻塞,则将FIFO作为非阻塞打开。我假设您知道您在流中寻找什么,并且会简单地放弃以前的一切


您还可以使用类似“当有东西要读取管道时通知”这样的功能。

如果我正确理解了您的问题,您还有另一个进程,通过
fifo向您的程序提供数据,并且新数据会废弃任何以前接收到的数据,因此您只对可用的最新数据感兴趣

在这种情况下,我的方法是使用
fcntl()
syscall的
O\u NONBLOCK
标志为
fifo
描述符设置非阻塞模式,并使用类似以下内容:

while (!exit_condition) {
    bytes = read(fd, wrkbuf, sizeof(wrkbuf));  // error handling omitted
    if (0 == bytes && bytes_to_process > 0) {
        process(wrkbuf, bytes_to_process);
        bytes_to_process = 0;
    } else
        bytes_to_process = bytes;
}

如果我正确理解了您的问题,那么您有另一个进程通过
fifo
向您的程序提供数据,并且新数据会淘汰以前接收到的任何数据,因此您只对可用的最新数据感兴趣

在这种情况下,我的方法是使用
fcntl()
syscall的
O\u NONBLOCK
标志为
fifo
描述符设置非阻塞模式,并使用类似以下内容:

while (!exit_condition) {
    bytes = read(fd, wrkbuf, sizeof(wrkbuf));  // error handling omitted
    if (0 == bytes && bytes_to_process > 0) {
        process(wrkbuf, bytes_to_process);
        bytes_to_process = 0;
    } else
        bytes_to_process = bytes;
}

“最后一行”是什么意思<代码>管道
(也称为
fifo
)是一个流,而不是一个文件,读取该行时,您不知道它是最后一行还是更多数据,稍后将可用。通过写入过程写入管道的最后一行是最新信息。这就是为什么当我收集信息时,我想要最新的。你说的“最后一行”是什么意思<代码>管道(也称为
fifo
)是一个流,而不是一个文件,读取该行时,您不知道它是最后一行还是更多数据,稍后将可用。通过写入过程写入管道的最后一行是最新信息。这就是为什么当我收集信息时,我想要最新的。