进程间通信-管道
来源:互联网 发布:万科金域名城怎么样 编辑:程序博客网 时间:2024/05/27 14:14
上一节讲到Unix只能通过fork这个系统调用创建进程,子进程获得父进程的数据空间、堆和栈的副本,但并不共享这部分存储空间。父、子进程之间交换信息的唯一途径就是传送打开的文件。
本节介绍进程之间相互通信的其他技术——进程间通信(IPC)。
管道
管道是Unix系统IPC最古老的形式,所有的Unix系统都提供这种通信机制。管道有以下2中局限性:
(1)历史上,它们是半双工的(即数据只能在一个方向上流动)。
(2)管道只能在具有公共祖先的两个进程间使用。
管道是通过pipe函数创建的
#include<unistd.h>int pipe(int fd[2]);返回值:若成功,返回0,若出错,返回-1
经由参数fd返回2个文件描述符,fd[0]为读而打开,fd[1]为写而打开。fd[1]的输出是fd[0]的输入。
单个进程的管道几乎没有任何用处。通常,进程会先调用pipe,接着调用fork,从而创建从父进程到子进程的IPC通道,反之亦然。
下面这个程序演示了pipe的用法
首先创建了从父进程到子进程的管道,并且父进程经由该管道向子进程传送数据。
#include<unistd.h>#include<stdio.h>#include<sys/wait.h>#include<errno.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>#define MAXLEN 1024int main(){ int n; int fd[2]; pid_t pid; char buf[MAXLEN]; if(pipe(fd)<0) { fprintf(stderr,"pipe error:[%s]\n",strerror(errno)); exit(1); } if((pid=fork())<0) { fprintf(stderr,"fork error:[%s]\n",strerror(errno)); exit(1); } else if(pid>0) { close(fd[0]); write(fd[1],"hello world\n",12); } else { close(fd[1]); n=read(fd[0],buf,MAXLEN); write(STDOUT_FILENO,buf,n); } exit(0);}
阅读全文
0 0
- 进程间管道通信
- 进程间通信: 管道
- 进程间通信--管道
- 进程间通信----管道
- 进程间通信--管道
- 进程间通信--管道
- 进程间通信----管道
- 进程间通信----管道
- 进程间通信--管道
- 进程间通信--管道
- 进程间通信--管道
- 进程间通信-管道
- 进程间管道通信
- 进程间管道通信
- 进程间通信--管道
- 进程间通信--管道
- 进程间通信--管道
- 进程间通信-管道
- mysql简介
- Twitter的分布式自增ID算法snowflake (Java版)
- Arbitrage--(Bellman—Ford)
- Linux下vmstat调优工具的深入分析
- tensorflow使用不同的学习率
- 进程间通信-管道
- Java日期格式转化工具(date格式转为string格式,string转date,string转timestamp类型)
- 感冒药
- redis -window
- MyBatis 延迟加载,一级缓存,二级缓存设置
- 一个简单的js快速排序算法
- nginx location的配置
- C++学习笔记十四之引用变量&
- GitHub desktop windows 创建、添加、上传 基础教程