pipe为无名管道,最古老的方法。
目录
特点:
- 1,一个管道建立时,会创建两个文件描述符,fd[0]为读而打开,fd[1]为写而打开。
- 2,只能用于具有亲缘关系的进程间通信(父子,兄弟)。
- 3,半双工。
- 4,可以用read,write函数进行操作,但它不属于任何文件系统,只存在于内存中。
API:
1)pipe()函数用于建立管道。
int pipe(int fd[2]); 产生两个文件标识,要关闭管道,则关闭两个文件标识。
注意:
当管道的一端被关闭后,下列规则起作用:
- 当读一个写端已被关闭的管道时,在所有数据都被读取后, read返回0,以指示达到了文件结束处(从技术方面考虑,管道的写端还有进程时,就不会产生文件的结束。可以复制一个管道的描述符,使得有多个进程具有写打开文件描述符。但是,通常一个管道只有一个读进程,一个写进程。下一节介绍F I F O时,我们会看到对于一个单一的FIFO常常有多个写进程)。
- 如果写一个读端已被关闭的管道,则产生信号 SIGPIPE。如果忽略该信号或者捕捉该信号并从其处理程序返回,则 write 出错返回,errno设置为EPIPE。
- 在写管道时,常数 PIPE_BUF 规定了内核中管道缓存器的大小。如果对管道进行 write调用,而且要求写的字节数小于等于 PIPE_BUF,则此操作不会与其他进程对同一管道(或 FIFO )的write操作穿插进行。但是,若有多个进程同时写一个管道(或 FIFO) ,而且某个或某些进程要求写的字节数超过 PIPE_BUF字节数,则数据可能会与其他写操作的数据相穿插。
程序:
#include<stdio.h>
#include<unistd.h>
int main()
{
int fd[2]; // 两个文件描述符
pid_t pid;
char buff[20];
if(pipe(fd) < 0) // 创建管道
printf("Create Pipe Error!\n");
if((pid = fork()) < 0) // 创建子进程
printf("Fork Error!\n");
else if(pid > 0) // 父进程
{
close(fd[0]); // 关闭读端
write(fd[1], "hello world\n", 12);
}
else
{
close(fd[1]); // 关闭写端
read(fd[0], buff, 20);
printf("%s", buff);
}
return 0;
}