Unix网络编程--进程间通信--管道通信
所有式样的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网络编程--进程间通信--管道通信相关推荐
- UNIX网络编程——进程间通信概述
一.顺序程序与并发程序特征 顺序程序特征 顺序性 封闭性:(运行环境的封闭性) 确定性 可再现性 并发程序特征 共享性 并发性 随机性 二.进程互斥 1.由于各进程要求共享资源,而且有些资源需要互斥使 ...
- 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)...
RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三 多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...
- 《UNIX网络编程 卷2:进程间通信(第2版)》——1.4 名字空间
本节书摘来自异步社区<UNIX网络编程 卷2:进程间通信(第2版)>一书中的第1章,第1.4节,作者:[美]W. Richard Stevens著,更多章节内容可以访问云栖社区" ...
- UNIX网络编程卷2:进程间通信(第2版)PDF——带完整书签
微信搜索[书为屋],获取更多免费学习资源和小工具,一起学习,一起进步! 下载地址:UNIX网络编程卷2:进程间通信(第2版) 带完整书签: 微信搜索[书为屋],获取更多免费学习资源和小工具,一起学习, ...
- UNIX网络编程学习笔记(代码超详细解析)(持续更新)
1. 其他函数准备 1. TCP 回射服务器程序: str_echo 函数 #include "unp.h"void str_echo(int sockfd) {ssize_t n ...
- linux下网络编程设置非阻塞,UNIX网络编程 非阻塞connect的实现
一.<UNIX网络编程>-非阻塞connect 在一个TCP套接口被设置为非阻塞之后调用connect,connect会立即返回EINPROGRESS错误,表示连接操作正在进行中,但是仍未 ...
- UNIX网络编程---套接字编程简介(三)
UNIX网络编程---套接字编程简介 一.概述 从这里开始正式开始网络编程之旅,所有的函数都是基本的库函数.这些都是网络编程的基础.Come on!!!! 二.套接字地址结构 大多数套接字函数都需要一 ...
- linux unix编程思想,Unix网络编程思想
本次博客主要总结参考<Unix网络编程>卷一前四章的知识,对TCP一对一通信进行重新改造和分析,经典就是经典,无可替代! 一.为什么使用包裹函数 任何现实世界的程序都必须检查每个函数调用是 ...
- 《Unix网络编程卷1-套接字联网API》第一个例子编译 不通过问题解决
<Unix网络编程卷1-套接字联网API>是本好书. 但是第一个例子不是很好编译. 需要如下步骤: 本人机器CentOS 5.4 1.下载源码 unpv13e解压到任意目录 然后按其rea ...
最新文章
- 20秒搭建web服务器,跨平台(mac,window)
- php sockent通信
- 深入理解Spark 2.1 Core (三):任务调度器的原理与源码分析
- webdriver 执行完毕关闭chromedriver进程
- html 鼠标移动3d视图,HTML5 鼠标悬停3D平面摇晃动效
- 模块单元学习笔记(日志记录模块os模块sys)
- SpringBoot项目遇到的一些问题
- PHP类: SEO必备的伪原创工具 (文章重写)
- 在Ubuntu中安装MySQL (转载)
- 洛谷 P4503 [CTSC2014]企鹅QQ 解题报告
- 老男孩python全栈day01
- Activiti工作流的流转任务和结束任务
- MitraStar DSL-2401HN-T1C-GV硬件与启动信息
- 农夫安全-安全网站导航 farmsec
- autoit入门小教程_入门介绍
- LightDM配置说明
- word文档里四级目录无法显示
- 【六更完结!由于字数限制开新文章继续】零基础信号与系统学习笔记:复指数信号、傅里叶级数的系数推导、三角函数正交性、离散傅里叶变换、相位补偿、z变换表、逆变换表、常见序列及其作用
- 全球plc品牌总结(欢迎补充)
- C++高级搜索算法迭代加深—————骑士精神