发信人: tcpip (俺的昵称改了), 信区: cnunix
标 题: 本地进程间通信第二讲:无名管道(一)
发信站: 哈工大紫丁香 (Sun Sep 26 15:31:21 1999), 转信
发信人: cpu (奔腾的心), 信区: Solaris
发信站: 华南网木棉站 (Fri Aug 21 21:31:26 1998), 转信
无名管道或者叫低级管道,是提供给父子进程间通信的一个手段。下面详细讲
述有关调用。
1.创建低级管道
#include <unistd.h>
int pipe(int filde[2]);
pipe调用创建一个可读写的先入先出管道,并生成两个与管道有关的文件描述
符,filed[0]专门负责读该管道,filed[1]专门负责写该管道,对管道的读写
可利用read和write调用。pipe调用成功返回0,否则返回-1,errno置相应的
出错码。
pipe
filed[0] <-=================<- filed[1]
该管道若只用于创建pipe的进程内也是可以的,该进程写filed[1],然后就
可从filed[0]把刚才写filed[1]的东东又读了出来呵呵,自娱自乐;) 但是也
就失去了进程间通信的意义了;(
通常该调用和fork一起用,由于fork会向子进程传递所有打开的文件描述符,
所以调用进程pipe成功再fork一把,pipe与父子进程的关系就成了下面这个样
子:
filed[0] <- pipe <- filed[1] (father)
》===========《
filed[0] <- <- filed[1] (son)
即管道只有一个,但是父子进程中共有四个描述符可以存取该管道!酱紫不好
玩呵呵比如father写它的filed[1]结果father和son的filed[0]都可以读,抢着
读会伤了父子感情呵呵。解决办法是各自关一个描述符,比如老子关了写的,
儿子关了读的,en...不错,儿子写给老子看天经地义:
(father) filed[0] <- pipe
》===========《
<- filed[1] (son)
以上过程可以由以下代码描述:
int pid;
int filed[2];
...
if (pipe(filed) < 0) {
perror("pipe");
exit(-1);
}
if ((pid = fork( )) < 0) {
perror("fork");
exit(-1);
} else if (pid > 0) { /* father */
close(filed[1];
read(filed[0], ...);
...
} else { /* son */
close(filed[0]);
write(filed[1], ...);
...
}
--
******************************************************
青岛啤酒,可能是世界上最好的啤酒 。。。 。。。
******************************************************
※ 修改:.trueip 于 Sep 26 15:35:08 修改本文.[FROM: dns.mtlab.hit.ed]
--
※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: dns.mtlab.hit.ed]
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: trueip.bbs@melon.gzn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.017毫秒