如何在Linux上刷新pipe()创建的管道?

时间:2016-08-24 16:41:48

标签: c linux

我想在Linux上刷新由pipe()调用创建的管道,因为我只对在调用 read()之后的数据感兴趣。我正在尝试关注ioctl:

ioctl_err = ioctl(G_MIDI_inout_event_pipe[0],I_FLUSH,FLUSHR);  
read(G_MIDI_inout_event_pipe[0],&event_type,1);

但ioctl返回ENOTTY并且管道未刷新。 如何正确冲洗这样的流?

1 个答案:

答案 0 :(得分:1)

没有标准的方法可以做到。

您可以考虑在管道上设置非阻塞属性,然后设置初步read()以清除数据,然后在收集您真正关注的数据之前将属性重置为阻止。您必须尝试至少读取管道大小 - 可以小到4 KiB或者可以大得多(在Linux,IIRC上为64 KiB)。这有点繁琐,但它会在TOCTOU(检查时间,使用时间)之间的最短时间窗口“工作” - 基本上,我假设的两个read电话。这对你来说无关紧要;这是在阅读过程开始后写的数据。