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的更多相关文章

  1. 第4章 管道和FIFO

    4.1 管道 管道是由pipe函数创建的,提供一个单向数据流. 头文件 #include <unistd.h> 函数原型 int pipe(int fd[2]); 返回值 成功则为0,出错 ...

  2. 第四章:管道与FIFO

    4.1:概述 管道是最初的Unix IPC形式,可追溯到1973年的Unix第三版.尽管对于许多操作来说很有用,但它们的根本局限在于没有名字,从而只能由亲缘关系的进程使用.这一点随FIFO的加入得改正 ...

  3. 管道和FIFO 一

    管道和FIFO   管道(pipe)       管道在Unix及Linux进程间通信是最基础的,很容易理解.管道就像一个自来水管,一端注入水,一端放出水,水只能在一个方向上流动,而不能双向流动.管道 ...

  4. linux进程间通信-有名管道(FIFO)

    有名管道(FIFO) 命名管道也被称为FIFO文件,是一种特殊的文件.由于linux所有的事物都可以被视为文件,所以对命名管道的使用也就变得与文件操作非常统一. (1)创建命名管道 用如下两个函数中的 ...

  5. Linux系统编程——进程间通信:命名管道(FIFO)

    命名管道的概述 无名管道,因为没有名字,仅仅能用于亲缘关系的进程间通信(很多其它详情.请看<无名管道>).为了克服这个缺点.提出了命名管道(FIFO).也叫有名管道.FIFO 文件. 命名 ...

  6. [转] IPC之管道、FIFO、socketpair

    管道和FIFO作为最初的UNIX IPC形式,现在已用得较少.SocketPair可作为全双工版本的管道,较为常用,这里简单做个笔记 管道 * 只用于有亲缘关系的进程间通信 * 单向,即半双工 (双向 ...

  7. linux 有名管道(FIFO)

    http://blog.csdn.net/firefoxbug/article/details/8137762 linux 有名管道(FIFO) 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时 ...

  8. UNIX环境高级编程——管道和FIFO限制

    系统加于管道和FIFO的唯一限制为: OPEN_MAX     一个进程在任意时刻打开的最大描述符数: PIPE_BUF       可原子的写往一个管道或FIFO的最大数据量. OPEN_MAX的值 ...

  9. UNIX环境高级编程——管道和FIFO的额外属性

    一个描述符能以两种方式设置成非阻塞. (1)调用open时可以指定O_NONBLOCK标志. writefd = open(FIFO1,O_WRONLY | O_NONBLOCK,0); (2)如果一 ...

随机推荐

  1. html5 做游戏 Quintus Sublime Text牛逼的神器

  2. 迷宫 (BFS)

    <挑战程序设计> P34 第一次使用pair 1.头文件:<utility>2.成员:mypair.first, mypair.second3.运算符:<.>.&l ...

  3. jQuery的DOM操作小案例

    案例一:下拉列表左右选择 <body> <div> <select style="width:60px" multiple size="10 ...

  4. 【三支火把】---一份程序看懂C程序printf()的几种常用用法

    闲来继续巩固我的学习之路,今天略微整理了一下,C程序中Printf()的一些常用用法,虽然自己以前好像会,但是不够系统,今天大致整理了一些,先贴上来看看,以后在看到其他,继续补充,希望能帮到一些像我一 ...

  5. 国外一些好用的UX/UI设计工具和资源分享

    国外一些好用的UX/UI设计工具和资源分享 你今天使用的设计工具也许不再适合以后的网页和APP设计项目了.新的工具不断的推出市场,目标只有一个,让你的工作更快.更容易而且工作成效更好.今天分享的这些U ...

  6. 三角形div的原理

    三角形div原理 首先我们写一个正常的方形div样式,但是我们把它的宽度和高度都设置为零,并且边框线设置的粗一点: { width:0px: height:0px; Border:20px solid ...

  7. Hyper-V虚拟化--逻辑网络、VM网络、逻辑交换机

    逻辑网络承接物理网卡和VM网卡 可以关联站点.主机组.VLAN.IP子网,配置静态IP地址池(虚机的PA地址从该静态IP地址池获取) 只有当逻辑网络中的网络站点关联了VLAN后,在VM中才可以选择VL ...

  8. JavaScript引擎的工作原理

    http://my.oschina.net/fuckBAT/blog/318355?fromerr=jK6wCh1p#OSC_h4_4

  9. CVPR 2013 录用论文【待更新】

    完整录用论文官方链接:http://www.pamitc.org/cvpr13/program.php 过段时间CvPaper上面应该会有正文链接 今年有关RGB-D摄像机应用和研究的论文渐多起来了. ...

  10. hibernate缓存技术

    1.缓存 2.Hibernate 缓存作用:为了提高查询效率. 3.第一次操作某个对象的时候,把操作的对象数据存储到缓存中,然后下一次在对同一个对象操作的时候,就不会在连接数据库. 4.Hiberna ...