我想在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并且管道未刷新。 如何正确冲洗这样的流?
答案 0 :(得分:1)
没有标准的方法可以做到。
您可以考虑在管道上设置非阻塞属性,然后设置初步read()
以清除数据,然后在收集您真正关注的数据之前将属性重置为阻止。您必须尝试至少读取管道大小 - 可以小到4 KiB或者可以大得多(在Linux,IIRC上为64 KiB)。这有点繁琐,但它会在TOCTOU(检查时间,使用时间)之间的最短时间窗口“工作” - 基本上,我假设的两个read
电话。这对你来说无关紧要;这是在阅读过程开始后写的数据。