基本创建和使用
匿名管道或简称管道是内核管理的对象,它们作为一对文件描述符暴露给进程,一个用于读取终端,另一个用于写入终端。它们是通过 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
来关闭管道末端。