第4章 管道与FIFO
4.1 概述
管道只在亲缘进程间使用,FIFO在任意进程间使用
4.2 管道
#include <unistd.h>
int pipe(int fd[])
fd[0]用来读管道,fd[1]用来写管道
1)命令who | sort | lp中的管道:
2)管道实现文件服务器与客户端:
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <error.h> #define MAXLINE 1024 void client(int readfd,int writefd);
void server(int readfd,int writefd); int main()
{
int fd1[];
int fd2[];
pipe(fd1);
pipe(fd2);
int pid;
if( (pid = fork()) < )
{
fprintf(stderr,"fork error\n");
exit(-);
}
if(pid > )
{
close(fd1[]);
close(fd2[]);
server(fd1[],fd2[]);
exit();
}
close(fd1[]);
close(fd2[]);
client(fd2[],fd1[]);
waitpid(pid,NULL,);
exit();
} void client(int readfd,int writefd)
{
size_t len;
char buf[MAXLINE];
fgets(buf,MAXLINE,stdin);
len = strlen(buf);
if(buf[len-] == '\n')
--len;
write(writefd,buf,len);
while( (len = read(readfd,buf,MAXLINE)) > )
write(STDOUT_FILENO,buf,len);
} void server(int readfd,int writefd)
{
char buf[MAXLINE];
ssize_t n;
if( (n = read(readfd,buf,MAXLINE)) ==)
{
fprintf(stderr,"error\n");
exit(-);
}
buf[n] = '\0';
int fd;
if( (fd = open(buf,O_RDONLY)) < )
{
snprintf(buf+n,sizeof(buf)-n,"can't open: %s\n",strerror(errno));
n = strlen(buf);
write(writefd,buf,n);
}
else
while( (n = read(fd,buf,MAXLINE)) > )
write(writefd,buf,n);
close(fd);
}
4.3 popen和pclose函数
#include <stdio.h>
FILE *popen(char *cmd,char *type)
int pclose(FILE *fp)
popen函数创建另外一个进程执行cmd,并在调用进程与创建进程之间建立一个单向管道,管道的一端与返回的FILE对象绑定
type为"w",FILE对象与管道的写端绑定,cmd的标准输入为管道的读端
type为"r",FILE对象与管道的读端绑定,cmd的标准输出为管道的写端
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLINE 1024
int main()
{
char buf[MAXLINE];
fgets(buf,MAXLINE,stdin);
int n = strlen(buf);
if(buf[n-] == '\n')
--n;
char cmd[MAXLINE];
snprintf(cmd,MAXLINE,"cat %s",buf);
FILE *fp = popen(cmd,"r");
while(fgets(buf,MAXLINE,fp) != NULL)
fputs(buf,stdout);
exit();
}
4.4 FIFO
FIFO又称命名管道
#include <sys/stat.h>
#include <sys/types.h>
int mkfifo(char *pathname,mode_t mode)
FIFO实现文件服务器和客户端
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h> int main(int argc,char *argv[])
{
if(mkfifo("./fifo1",S_IRUSR|S_IWUSR) < )
{
fprintf(stderr,"mkfifo error\n");
exit(-);
}
if(mkfifo("./fifo2",S_IRUSR|S_IWUSR) < )
{
fprintf(stderr,"mkfifo error\n");
exit(-);
}
int pid;
if( (pid = fork()) < )
{
fprintf(stderr,"fork error\n");
exit(-);
}
if(pid == )
{
int fd1 = open("./fifo1",O_RDONLY);
int fd2 = open("./fifo2",O_WRONLY);
server(fd1,fd2);
exit();
}
int fd1 = open("./fifo1",O_WRONLY);
int fd2 = open("./fifo2",O_RDONLY);
client(fd2,fd1);
waitpid(pid,NULL,);
exit();
}
4.5 管道、FIFO的阻塞与非阻塞
第4章 管道与FIFO的更多相关文章
- 第4章 管道和FIFO
4.1 管道 管道是由pipe函数创建的,提供一个单向数据流. 头文件 #include <unistd.h> 函数原型 int pipe(int fd[2]); 返回值 成功则为0,出错 ...
- 第四章:管道与FIFO
4.1:概述 管道是最初的Unix IPC形式,可追溯到1973年的Unix第三版.尽管对于许多操作来说很有用,但它们的根本局限在于没有名字,从而只能由亲缘关系的进程使用.这一点随FIFO的加入得改正 ...
- 管道和FIFO 一
管道和FIFO 管道(pipe) 管道在Unix及Linux进程间通信是最基础的,很容易理解.管道就像一个自来水管,一端注入水,一端放出水,水只能在一个方向上流动,而不能双向流动.管道 ...
- linux进程间通信-有名管道(FIFO)
有名管道(FIFO) 命名管道也被称为FIFO文件,是一种特殊的文件.由于linux所有的事物都可以被视为文件,所以对命名管道的使用也就变得与文件操作非常统一. (1)创建命名管道 用如下两个函数中的 ...
- Linux系统编程——进程间通信:命名管道(FIFO)
命名管道的概述 无名管道,因为没有名字,仅仅能用于亲缘关系的进程间通信(很多其它详情.请看<无名管道>).为了克服这个缺点.提出了命名管道(FIFO).也叫有名管道.FIFO 文件. 命名 ...
- [转] IPC之管道、FIFO、socketpair
管道和FIFO作为最初的UNIX IPC形式,现在已用得较少.SocketPair可作为全双工版本的管道,较为常用,这里简单做个笔记 管道 * 只用于有亲缘关系的进程间通信 * 单向,即半双工 (双向 ...
- linux 有名管道(FIFO)
http://blog.csdn.net/firefoxbug/article/details/8137762 linux 有名管道(FIFO) 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时 ...
- UNIX环境高级编程——管道和FIFO限制
系统加于管道和FIFO的唯一限制为: OPEN_MAX 一个进程在任意时刻打开的最大描述符数: PIPE_BUF 可原子的写往一个管道或FIFO的最大数据量. OPEN_MAX的值 ...
- UNIX环境高级编程——管道和FIFO的额外属性
一个描述符能以两种方式设置成非阻塞. (1)调用open时可以指定O_NONBLOCK标志. writefd = open(FIFO1,O_WRONLY | O_NONBLOCK,0); (2)如果一 ...
随机推荐
- 最简单的基于FFMPEG的音频编码器(PCM编码为AAC)
http://blog.csdn.net/leixiaohua1020/article/details/25430449 本文介绍一个最简单的基于FFMPEG的音频编码器.该编码器实现了PCM音频采样 ...
- puppet案例
实例一.文件分发描述:通过puppet服务端可以向被管理机(客户端)上推送文件,方法是使用file类型的source属性 第一步:#vi /etc/puppet/fileserver.conf 1 ...
- hdoj 1495 非常可乐【bfs隐式图】
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Cocos2d-x学习笔记之Cocos2d-x开发环境搭建
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Cocos2d-x源码包下载地址: http://cocos2d-x.org/projects/cocos2d-x/ ...
- solr 搜索引擎及搜索推荐应用
搜索框里输入关键字,从mongodb里搜索出关键字相关关键字记录.用户从相关关键字里选取一个作为最后关键字从solr里查询数据. 1创建索引:从sql里goodsinfo表查所有记录,solr.Add ...
- Systemd 入门教程:命令篇
http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html
- iOS开发中常见的语句@synthesize obj=obj的意义详解
我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一 ...
- Maven Build Profiles--reference
What is Build Profile? A Build profile is a set of configuration values which can be used to set or ...
- zTree下拉菜单多级菜单多选实现
惯例,先上图: 这是在一个项目中,为了满足样式美观.多级菜单以及多选而将zTree插件更改过后的效果. 在实际的开发过程中,本来zTree也是可以满足需求的,但是zTree多选的话需要checkbox ...
- web服务器决定支持多少人同时在线的因素
经常遇到一些做WEB用户咨询服务器支持在线人数问题,在此做个简单介绍.非技术性讨论,如有疏漏或错误,敬请原谅和指导.以普通单路服务器为例,CPU处理多个进程,并非是同一时刻处理的,(可以精确到1/10 ...