进程间通信--pipe
管道的两种局限性:
- 历史上,他们是半双工的(即数据只能够在一个方向上流动). 现在某些系统也提供全双工管道,但是为了最佳的移植性,我们决不应该预先假定系统使用此特性
- 他们只能够在具有公共祖先的进程间使用. 通常一个管道由一个进程创建, 然后该进程通过调用fork, 此后父,子进程之间就可以使用该管道
尽管有这两种局限, 但半双工管道仍然是最常用的 IPC 形式.
管道由调用pipe函数创建:
#include<unistd.h>
int pipe(int filedes[2]);
返回值: 0: 成功, -1: 失败
经由参数filedes返回的两个文件描述符:
filedes[0]: 读
filedes[1]: 写
filedes[1]的输出既是filedes[0]的输入
由此, 调用fork之后做什么取决于我们想要有的数据流动方向. 对于从父进程到子进程的管道, 父进程关闭管道的读端filedes[0], 子进程则关闭写端filedes[1]. 如代码所示:
/*******************************************************************************
* 版权所有:
* 模 块 名:
* 文 件 名:pipe.c
* 实现功能:
* 作 者:XYZ
* 版 本:V1.0
* 日 期:2013.08.19
* 其他说明:创建一个从父进程到子进程的管道,并且父进程经改管道向子进程传递数据
********************************************************************************/
// pipe.c
#include<stdio.h>
#include"apue.h" int main()
{
int n;
int fd[2];
pid_t pid;
char line[MAXLINE]; if (pipe(fd) < 0)
{
perror("pipe error");
}
if ((pid = fork()) < 0)
{
perror("fork error");
}
else if (pid > 0)
{
// parent
close(fd[0]); // close the read pipe
write(fd[1], "hello world\n", 12);
}
else
{
// chlid
close(fd[1]); // close the write pipe
n = read(fd[0], line, MAXLINE);
write(STDOUT_FILENO, line, n);
} exit(0);
}
相反, 为了构造从子进程到父进程的管道, 则父进程关闭了写端fd[1], 子进程需关闭读端fd[0].
当管道的一端被关闭后, 有以下两条规则起作用:
- 当读一个写端已被关闭的管道时,在所有数据都被读取后,read返回0, 以指示达到了文件的结束处.(从技术方面考虑,管道的写端还有进程时,就不会产生文件的结束.可以复制一个管道的描述符,使得有多个进程对他具有写打开文件描述符. 但是 ,通常一个管道只有一个读进程,一个写进程)
- 如果写一个读端已被关闭的管道, 则产生信号SIGPIPE.如果忽略该信号或者捉该信号并从其处理程序返回,则write返回-1, error设置为EPIPE.
在写管道FIFO时,常量PIPE_BUF规定了内核中管道缓冲区的大小.如果对管道调用write,而且要求写的字节数小于等于PIPE_BUF,则此操作不会与其他进程对同一个管道的write操作穿插进行. 但是, 要是有多个进程同时写一个管道,而且有进程要求写的字节数超过PIPE_BUF字节时, 则写操作的数据可能会相互穿插. 用pathconf或者fpathconf函数可以确定PIPE_BUF的值.
进程间通信--pipe的更多相关文章
- 多进程—进程同步控制,IPC
multiprocessing包—Process模块开启多进程的两种方式,Process的方法,守护进程 进程同步控制—multiprocessing.Lock multiprocessing.Se ...
- gj11 多线程、多进程和线程池编程
11.1 python中的GIL # coding=utf-8 # gil global interpreter lock (cpython) # python中一个线程对应于c语言中的一个线程 # ...
- Python 进程(process)
1. 进程 1.1 进程的创建 fork 正在运行着的代码,就称为进程 # 示例: import os # 注意: fork 函数,只在 Unix/Linux/Mac 上运行, windows 不可以 ...
- linux进程学习笔记
学习了linux下的进程,觉得应该整理一下,忘得差不多了,顺便回顾一下. 学而时习之,不亦说乎~~ 进程笔记 ,什么是进程? The Single UNIX Specification, Versio ...
- Python学习笔记整理总结【网络编程】【线程/进程/协程/IO多路模型/select/poll/epoll/selector】
一.socket(单链接) 1.socket:应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socke ...
- 第十章:Python高级编程-多线程、多进程和线程池编程
第十章:Python高级编程-多线程.多进程和线程池编程 Python3高级核心技术97讲 笔记 目录 第十章:Python高级编程-多线程.多进程和线程池编程 10.1 Python中的GIL 10 ...
- Linux进程间通信(三):匿名管道 popen()、pclose()、pipe()、close()、dup()、dup2()
在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式——匿名管道,通过它进程间可以交换更多有用的数据. 一.什 ...
- Unix/Linux进程间通信(二):匿名管道、有名管道 pipe()、mkfifo()
1. 管道概述及相关API应用 1.1 管道相关的关键概念 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管 ...
- 进程间通信和同步:pipe、FIFO、消息队列、信号量、共享内存、信号
一.半双工管道(pipe) 关于管道详细介绍可参考http://www.cnblogs.com/nufangrensheng/p/3560130.html. 1.管道实现父子进程间通信实例: /* p ...
随机推荐
- 图像预处理第9步:存为.bmp文件
//图像预处理第9步:将最终标准化后的字符图像分为单个单个的HDIB保存,并存为.bmp文件 void CChildView::OnImgprcToDibAndSave() { unsigned ch ...
- Javascript 数组常用操作方法
一.数组 Array 1.创建数组 /* 构造函数 */ var arr1 = new Array(); //创建一个空数组 var arr1 = new Array(5); //创建指定长度数组(数 ...
- 跨站请求伪造 CSRF / XSRF<二:应用>
防御的方法主要有两种<java示例> 1.检查Referer字段 HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址.在处理敏感数据请求时,通常来说,Referer字 ...
- js 获取URL传递过来的值
URL: http://127.0.0.1:8080/jspews/pews/inspection/InspectCheckCard.jsp?checkDate=2015-03-31 传递的值: ch ...
- java/Android 接口调用的几种写法
虽然Handler用的地方比较普遍,但是接口也有他的独特之处,比较直观,然后降低了耦合性 如有一接口,需要将数据传给使用的activity中,接口如下 public interface PushVal ...
- node.js基础 1之 HTTP事件回调进阶(HTTP模块)
HTTP概念进阶 1. 什么是回调? 回调是异步编程时的基础,将后续逻辑封装成起始函数的参数,逐层嵌套 2. 什么是同步/异步? 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯 ...
- ftp put本地文件至ubuntu服务器报错
起因:我想把本地下载的安装包上传至服务器. 由于Mac的ftp图形化客户端还没找着合适的,就想着用命令也是一样的. 但是又进坑了. 下载能够正常运行: ftp> get 2.jpg /Users ...
- css3实现颜色渐变以及兼容性处理
有时我们会看到网站上的一些图片是渐变色的,这些图片有的是ui设计出来的,有的则是直接通过css3制作出来的.下面就讲一下css3实现渐变色的方法,以及在各个浏览器上的兼容性. CSS3 Gradien ...
- JavaWeb前端:CSS
CSS 主要是要熟悉的掌握选择器 Div 的盒模型: 整个网页被切割成一个一个盒子,盒子可以套盒子,每个盒子通过以下几个主要属性来控制显示位置: 边框 Border-top, Border-botto ...
- UDP的connect函数
UDP的connect没有三次握手过程,内核只是检测是否存在立即可知的错误(如一个显然不可达的目的地), 记录对端的的IP地址和端口号,然后立即返回调用进程. 未连接UDP套接字(unconnecte ...