繁体   English   中英

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

[英]How to flush a pipe created by pipe() on 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并且未刷新管道。 如何正确冲洗这种水流?

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

您可以考虑在管道上设置非阻塞属性,然后通过初步的read()清除数据,然后在收集真正需要的数据之前将属性重置为阻塞。 您必须尝试至少读取管道大小-可以小到4 KiB或更大(在Linux上为64 KiB,IIRC)。 这有点奇怪,但是它可以在TOCTOU(检查时间,使用时间)之间的时间间隔最小的情况下“工作”,基本上,这是我假设的两次read调用。 那对你没关系; 它是在读取过程开始后写入的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM