linux之无名管道

1、查看命令: man 2 pipe

2.头文件:#include <unistd.h>

3、函数原型: int pipe(int pipefd[2]);
a、pipefd[2] :无名管道的两个文件描述符,int型的数组,大小为2,pipefd[0]为读端,pipefd[1]为写端

4、返回值:
成功:返回0
失败:返回-1

5、函数特点:
无名管道是最简单的常用于一对一的亲缘进程间通信的方式,既然说是管道,所以可以想象成一条水管,连接两个进程
一个进程负责输入数据,另一个进程负责接收数据,反过来也一样。

6、无名管道的缺点:
a、没有名字,因此无法使用open()打开
b、只能用于亲缘进程间(如父子进程、兄弟进程、祖孙进程等)通信
c、半双工工作方式,读写端是分开的,pipefd[0]为读端,pipefd[1]为写端
d、写入操作不具有原子性,因此只能用于一对一的简单通信
e、不能用lseek()来定位

这是演示代码:
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
#include<wait.h>
#include<string.h>

#define LENGTH 50  //字符数组的大小
int main(int argc,char **argv)
{
    int status;//进程退出时用
    int pipefd[2];//用于保存无名管道的两个文件描述符,pipefd[0]为读端,pipefd[1]为写端
    
    int ret;
    pid_t pid;
    
    /*创建无名管道,需要在fork()之前创建,这样子进程才能继承无名管道*/
    ret = pipe(pipefd);
    if(ret == -1)//创建失败
    {
        perror("pipe");
        exit(1);//异常退出
    }
    
    pid = fork();//创建子进程
    
    if(pid != 0)//父进程,负责从无名管道中读取数据
    {
          wait(&status);//等待子进程退出
          char buf[LENGTH];
          read(pipefd[0],buf,sizeof(buf));//从无名管道中读取数据,read函数会阻塞
          printf("来自子进程的信息: %s",buf);
        
    }
    
    
    if(pid == 0)//子进程,负责把数据写入无名管道
    {
           char buf[LENGTH];
           bzero(buf,sizeof(buf));//清空缓冲区
           puts("请输入你要发送给父进程的内容:");
           fgets(buf,sizeof(buf),stdin);
           write(pipefd[1],buf,sizeof(buf));//把数据写入无名管道
           exit(0);//子进程退出
    }
    
    close(pipefd[0]);//关闭无名管道中的读端
    close(pipefd[1]);//关闭无名管道中的写端
    return 0;
}