进程通信值pipe管道

1. 基本概念

管道是一种把两个进程之间的标准输入和标准输出连接起来的机制。管道是一种历史悠久的进程间的通信的方法,自从unix操作系统诞生之初,管道就存在了。
进程创建管道,每次创建两个文件描述符来操作管道。其中一个队管道进行写操作,另一个描述符对文件进行读操作。下图显示了管道如何将两个进程通过内核连接起来的状态。

管道是半双工的,只能由一端发一端接收,因此如果要实现全双工通信,必须要设置两个管道。由于进程A和进程B都能够访问管道的两个描述符,因此管道在创建之后要设置在各个进程中的方向,希望数据向哪个方向传输。对管道的读写操作和一般的IO系统函数一致,使用write函数写入数据,但是不支持偏移函数lseek。

2 pipe()函数介绍

创建管道的函数原型为:
#include
Int pipe(int filedes[2]);
数组中的filedes是一个文件描述符的数组,用于保存管道返回的两个文件描述符。数组

中的第一个filedes[0]是为了读操作创建的,filedes[1]是为了写操作创建的。成功返回0,失败返回-1。

#include
#include
#include
#include
#include
#include

//父进程向子进程发送数据
int main()
{
   int fd[2];
   int ret=pipe(fd);
   if(ret==-1)
   {
       printf("pipe failed\n");
       exit(EXIT_FAILURE);
   }
   pid_t pid=fork();
   if(pid==-1)
   { 
       printf("fork failed\n");
       exit(EXIT_FAILURE);
   }
   if(pid==0)
   {
        close(fd[1]);//关闭子进程的写
        char buf[1024];
        memset(buf,0,sizeof(buf));
        read(fd[0],buf,sizeof(buf));
        printf("child recevied-----%s\n",buf);
   }
   if(pid>0)
   {
        close(fd[0]);//关闭父进程的读
        char str[]="hello child";
        write(fd[1],str,strlen(str));
        wait(NULL);//回收子进程
   }
   return 0;
}


你可能感兴趣的:(linux网络编程)