所有式样的Unix都提供管道,它由 pipe 函数创建,提供一个单路(单向)数据流。

      原型如下:

#include <unistd.h>
int pipe(int fd[2]);

该函数返回两个文件描述符:fd[0] fd[1]。前者打开用于读,后者打开来写。(都是站在进程的角度上来看读和写)

      管道的典型用途是以下述方式为两个不同的进程(一个是父进程,一个是子进程)提供进程间的通信手段。首先,由一个进程创建管道后调用 fork 派生出一个自身的副本,过程如下所示:


       注意:其实上面这张图说明的道理没有问题,但是图的画法确实是存在问题的。因为管道是单向传输数据流的,所以,当有两个不同的进程进行通信时,需要的是两个管道协同合作,而不是上图的画法。我们可以考虑一种情况,当父进程或者是子进程往管道里写入数据,因为管道里只要有数据就可以读出,所以,如果这时如果父进程或者是子进程读管道中的数据,那么读出的可能就是刚刚写入的数据,这样,就没能完成通信的任务。

      所以,如果要实现通信,正确的步骤是:

      (1)创建管道1( fd1[0] 和 fd1[1] )和管道( fd2[0] 和 fd2[1] )

      (2)fork;

      (3)父进程关闭管道1的读出端

      (4)父进程关闭管道2的写入端

      (5)子进程关闭管道1的写入端

      (6)子进程关闭管道2的读出端

      完成了以上步骤就好像下面这张图这样:



      例子:

      现在描述一个客户端-服务器的例子。main 函数创建两个管道并用 fork 生成一个子进程。客户然后作为父进程运行,服务器则作为子进程运行。第一个管道用于从客户向服务器发送路径名,第二个管道用于从服务器向客户发送该文件的内容(或者是一个出错消息),这样设置完毕后就得到下图所示的情形:


      下面请看实现的实例程序:

      mainpipe.c

#include <sys/types.h> /* basic system data types */
#include    <sys/time.h>  /* timeval{} for select() */
#include    <time.h>      /* timespec{} for pselect() */
#include    <errno.h>
#include    <fcntl.h>     /* for nonblocking */
#include    <limits.h>        /* PIPE_BUF */
#include    <signal.h>
#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#include    <sys/stat.h>  /* for S_xxx file mode constants */
#include    <unistd.h>
#include    <sys/wait.h>#define MAXLINE 1024void client(int, int);
void server(int, int);int main(int argc, char **argv)
{int pipe1[2], pipe2[2];pid_t childpid;pipe(pipe1);pipe(pipe2);if ((childpid = fork()) == 0) {close(pipe1[1]);close(pipe2[0]);server(pipe1[0], pipe2[1]);exit(0);}close(pipe1[0]);close(pipe2[1]);client(pipe2[0], pipe1[1]);waitpid(childpid, NULL, 0);exit(0);
}void client(int readfd, int writefd)
{size_t len;ssize_t n;char buff[MAXLINE];fgets(buff, MAXLINE, stdin);len = strlen(buff);if (buff[len - 1] == '\n')len--;write(writefd, buff, len);while ((n = read(readfd, buff, MAXLINE)) > 0)write(STDOUT_FILENO, buff, n);
}void server(int readfd, int writefd)
{int fd;ssize_t n;char buff[MAXLINE+1];if ( (n = read(readfd, buff, MAXLINE)) == 0) {printf("end-of-file while reading pathname");exit(-1);}buff[n] = '\0';if ( (fd = open(buff, O_RDONLY)) < 0) {snprintf(buff + n, sizeof(buff) - n, ": can't open, %s\n", strerror(errno));n = strlen(buff);write(writefd, buff, n);} else {while( (n = read(fd, buff, MAXLINE)) > 0)write(writefd, buff, n);close(fd);}
}

 我在主目录下放置文件 test.txt,文件内容如下所示:

Hello! This is DLUTBruceZhang!
I love three things!
The sun, for the day;
The moon, for the night;
The you, forever.

编译运行程序得到如下输出:


      

       由此可见,利用管道实现了进程间通信。

Unix网络编程--进程间通信--管道通信相关推荐

  1. UNIX网络编程——进程间通信概述

    一.顺序程序与并发程序特征 顺序程序特征 顺序性 封闭性:(运行环境的封闭性) 确定性 可再现性 并发程序特征 共享性 并发性 随机性 二.进程互斥 1.由于各进程要求共享资源,而且有些资源需要互斥使 ...

  2. 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)...

    RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三  多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...

  3. 《UNIX网络编程 卷2:进程间通信(第2版)》——1.4 名字空间

    本节书摘来自异步社区<UNIX网络编程 卷2:进程间通信(第2版)>一书中的第1章,第1.4节,作者:[美]W. Richard Stevens著,更多章节内容可以访问云栖社区" ...

  4. UNIX网络编程卷2:进程间通信(第2版)PDF——带完整书签

    微信搜索[书为屋],获取更多免费学习资源和小工具,一起学习,一起进步! 下载地址:UNIX网络编程卷2:进程间通信(第2版) 带完整书签: 微信搜索[书为屋],获取更多免费学习资源和小工具,一起学习, ...

  5. UNIX网络编程学习笔记(代码超详细解析)(持续更新)

    1. 其他函数准备 1. TCP 回射服务器程序: str_echo 函数 #include "unp.h"void str_echo(int sockfd) {ssize_t n ...

  6. linux下网络编程设置非阻塞,UNIX网络编程 非阻塞connect的实现

    一.<UNIX网络编程>-非阻塞connect 在一个TCP套接口被设置为非阻塞之后调用connect,connect会立即返回EINPROGRESS错误,表示连接操作正在进行中,但是仍未 ...

  7. UNIX网络编程---套接字编程简介(三)

    UNIX网络编程---套接字编程简介 一.概述 从这里开始正式开始网络编程之旅,所有的函数都是基本的库函数.这些都是网络编程的基础.Come on!!!! 二.套接字地址结构 大多数套接字函数都需要一 ...

  8. linux unix编程思想,Unix网络编程思想

    本次博客主要总结参考<Unix网络编程>卷一前四章的知识,对TCP一对一通信进行重新改造和分析,经典就是经典,无可替代! 一.为什么使用包裹函数 任何现实世界的程序都必须检查每个函数调用是 ...

  9. 《Unix网络编程卷1-套接字联网API》第一个例子编译 不通过问题解决

    <Unix网络编程卷1-套接字联网API>是本好书. 但是第一个例子不是很好编译. 需要如下步骤: 本人机器CentOS 5.4 1.下载源码 unpv13e解压到任意目录 然后按其rea ...

最新文章

  1. 20秒搭建web服务器,跨平台(mac,window)
  2. php sockent通信
  3. 深入理解Spark 2.1 Core (三):任务调度器的原理与源码分析
  4. webdriver 执行完毕关闭chromedriver进程
  5. html 鼠标移动3d视图,HTML5 鼠标悬停3D平面摇晃动效
  6. 模块单元学习笔记(日志记录模块os模块sys)
  7. SpringBoot项目遇到的一些问题
  8. PHP类: SEO必备的伪原创工具 (文章重写)
  9. 在Ubuntu中安装MySQL (转载)
  10. 洛谷 P4503 [CTSC2014]企鹅QQ 解题报告
  11. 老男孩python全栈day01
  12. Activiti工作流的流转任务和结束任务
  13. MitraStar DSL-2401HN-T1C-GV硬件与启动信息
  14. 农夫安全-安全网站导航 farmsec
  15. autoit入门小教程_入门介绍
  16. LightDM配置说明
  17. word文档里四级目录无法显示
  18. 【六更完结!由于字数限制开新文章继续】零基础信号与系统学习笔记:复指数信号、傅里叶级数的系数推导、三角函数正交性、离散傅里叶变换、相位补偿、z变换表、逆变换表、常见序列及其作用
  19. 全球plc品牌总结(欢迎补充)
  20. C++高级搜索算法迭代加深—————骑士精神

热门文章

  1. 【Linux基础】第五周作业
  2. 硬回车与软回车[转]
  3. 数组方法关于任意数字类型的数组求最大值解决办法
  4. WCF Data Service文章列表
  5. 【ACM】杭电1073:Online Judge
  6. GridView强制换行与自动换行
  7. 掘金小册Jenkins大纲准备
  8. sysbench-系统、数据库压力测试工具
  9. Servlet -- 重定向
  10. iOS - OC Block 代码块