进程间通信--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 ...
随机推荐
- Java动态代理与Cglib库
JDK动态代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在 ...
- zend studio 10破解/汉化
http://blog.csdn.net/qq1355541448/article/details/16807429
- MySQL AHI 实现解析
版权声明:本文由musazhang原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/904925001482373849 来源 ...
- 【OS】分页和分段
在网上找到了一个比较形象的比喻 打个比方,比如说你去听课,带了一个纸质笔记本做笔记.笔记本有100张纸,课程有语文.数学.英语三门,对于这个笔记本的使用,为了便于以后复习方便,你可以有两种选择. ...
- Name jdbc is not bound in this Context
简介 今天接手中行一个交通罚款web工程时,从svn同步下来后,,启动竟然报找不到数据源错误,本来以为很简单解决找了两个小时,现在记录下来. Exception: Name jdbc is not b ...
- stopping NetworkManager daemon failed
1 初次安装NetworkManager时发现,无法将这个服务关闭 2 上网找了一圈,也没找到原因 3 重启服务器后就能正常关闭了 4 将该服务删除重装也能正常关闭 5 下回重装系统时再观察一下
- IE兼容问题,各类css hack代码(亲测有效)
现在大部分企业对浏览器兼容要求是IE7+或者IE8+,要求IE6的很少,此处一并写出. IE6: _margin-top: 20px; IE6+IE7: *margin-top: 20px; +mar ...
- (转载)数据库出现ORA-00283/ORA-01610的问题
在这里需要感谢棉花糖给予无私帮助,真的谢谢他!http://blog.itpub.net/67668/viewspace-353270/处理过程可以参照http://www.itpub.net/vie ...
- sql语句查询服务器的数据库,数据库的全部表和表的全部列
下面是数据库的结构: 数据库名是:edushi_zixunok;表名是infoArticle --获取所有用户名 SELECT * FROM sys.sysusers --获取所有用户数据库 SELE ...
- springMVC 错误页面配置
在Spring MVC应用程序中,404 error code 被合适的配置.web.xml文件中配置如下所示: <!-- spring mvc start --> <servlet ...