概述
一 管道的概念:
管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质:
1. 其本质是一个伪文件(实为内核缓冲区)
2. 由两个文件描述符引用,一个表示读端,一个表示写端。
3. 规定数据从管道的写端流入管道,从读端流出。
管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。
管道 分为 标准流管道,无名管道(PIPE),命名管道(FIFO)
管道的局限性:
① 数据自己读不能自己写。
② 数据一旦被读走,便不在管道中存在,不可反复读取。
③ 由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。
其中 无名管道 ’标准管道 只能在有公共祖先的进程间使用管道。
二 无名管道建立流程
demo 两个子进程 写父进程读
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
pid_t pid;
int fd[2], i, n;
char buf[1024];
int ret = pipe(fd);
if (ret == -1)
{
perror("pipe error");
exit(1);
}
for (i = 0; i < 2; i++)
{
if ((pid = fork()) == 0)
{
if (i == 0)
{
close(fd[0]);
write(fd[1], "1.hellon", strlen("1.hellon"));
}
else if (i == 1)
{
close(fd[0]);
write(fd[1], "2.worldn", strlen("2.worldn"));
}
break;
}
else if (pid == -1)
{
perror("pipe error");
exit(1);
}
}
if (pid > 0)
{
close(fd[1]); //父进程关闭写端,留读端读取数据
// sleep(1);
n = read(fd[0], buf, 1024); //从管道中读数据
write(STDOUT_FILENO, buf, n);
for (i = 0; i < 2; i++) //两个儿子wait两次
wait(NULL);
}
return 0;
}
结果
三 标准管道
demo
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#define BUFSIZE 1024
int main()
{
FILE *fp;
char *cmd = "printenv";
char buf[BUFSIZE];
buf[BUFSIZE-1] = '