进程通信值pipe管道

来源:互联网 发布:矩阵的秩8个性质及证明 编辑:程序博客网 时间:2024/05/21 09:04

1. 基本概念

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

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

2 pipe()函数介绍

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

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

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/types.h>#include<wait.h>//父进程向子进程发送数据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;}


原创粉丝点击