gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:32:38 26 4
gpt4 key购买 nike

我想在 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 调用。那对你来说不重要;它是在读取过程开始之后写入的数据。

关于c - 如何在 Linux 上刷新由 pipe() 创建的管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39128825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com