在 C 中清除管道

clear a Pipe in C

我正在将数据从一个进程发送到另一个进程 pipe,我想在读取后清除 pipeC 中是否有可以执行此操作的函数?

是的。它只是 stdio 库提供的 read 函数。您必须根据需要多次调用它,以确保管道为空。

如文档所示,read 函数尝试从您首先为其传递文件描述符的 I/O 通道(在您的情况下为管道)读取 count 字节参数,并将其内容放入具有足够空间容纳它的缓冲区中。

让我们回想一下,read 函数可能 return 一个值指示读取的字节数小于请求的字节数。如果要读取的字节数比您预期的要少,这完全没问题。

还请记住,如果没有可读取的内容并且编写器尚未关闭相关描述符,则从管道读取会阻塞,这意味着在对方关闭其描述符之前您不会获得 EOF。因此,您在尝试从管道读取时会卡住。如果您打算避免上述可能性,我建议按照以下基于 poll 函数的解决方案来验证是否有数据可从文件描述符中读取:

#include <poll.h>

struct pollfd pfd;

int main(void)
{
    /* your operations */

    pfd.fd = pipe_fd;
    pfd.events = POLLIN;

    while (poll(&pfd, 1, 0) == 1)
    {
        /* there's available data, read it */
    }

    return 0;
}