基本创建和使用

匿名管道或简称管道是内核管理的对象,它们作为一对文件描述符暴露给进程,一个用于读取终端,另一个用于写入终端。它们是通过 pipe(2)函数创建的:

int pipefds[2];
int result;

result = pipe(pipefds);

成功时,pipe() 在提供的数组的索引 0 处记录管道读取结束的描述符,并在索引 1 处记录写入结束的描述符; 这些索引类似于标准流的传统文件描述符号。

创建了一个管道后,可以使用 POSIX I / O 函数写入写入端或从读取端读取:

过程 1:

ssize_t bytes_written = write(pipefds[1], "Hello, World!", 14);

过程 2:

char buffer[256];
ssize_t bytes_read = read(pipefds[0], buffer, sizeof(buffer));

或者,可以使用 fdopen() 将两个管端中的一个包裹在 FILE 结构中,以便与 C stdio 函数一起使用:

FILE *write_end = fdopen(pipefds[1]);

if (write_end) {
    fputs("Hello, World!");
}

管道具有有限的 I / O 缓冲区,并且对具有完整缓冲区的管道的普通写入将被阻塞。因此,管道不是线程与自身通信的安全机制,就好像写入管道的线程也是从中读取的唯一线程一样,然后只要写入阻塞该线程死锁。

只要任何进程具有任一管道末端的打开文件描述,管道就会持续存在。close(2)函数可用于关闭由文件描述符表示的管道末端,fclose(3)可用于通过缠绕在其周围的 FILE 来关闭管道末端。