有名管道

无名管道和有名管道:

1. 管道是特殊类型的文件,在满足先入先出的原则写可以读写,不能定位读写位置。

2.管道是单向的。

3.无名管道阻塞于读写位置,而有名管道阻塞在创建位置

4.无名管道一般只用于亲缘关系进程间通信;有名管道以磁盘文件的方式存在,可以实现本机任意两进程间通信。

shell创建有名管道

mknod 管道名 p  //创建名为PIPETEST的有名管道 mknod为命令 p是参数,表示有名管道

指令 > 管道名 &   //将指令结果输入到到管道文件中

指令 < 管道名      //以指定管道名中的内容做为输入

编程实现有名管道

int mkfifo (__const char *__path, __mode_t __mode):建立的有名管道文件必须之前不存在, mode是该文件的权限。成功返回0,否则返回-1.

通过read(), write()实现读写操作。

其阻塞方式见下图(我懒得打字了,就上图吧....)

例子:

写进程

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/stat.h> #define FIFO_NAME "/tmp/my_fifo" //要创建的有名管道的路径
int main(int argc, char * argv[])
{
int pipe_fd;
int res;
char buffer[] = "hello world!";
if(access(FIFO_NAME, F_OK) == -) //文件是否存在
{
res = mkfifo(FIFO_NAME, ); //创建管道
if(res != )
{
fprintf(stderr, "Could not create fifo %s\n", FIFO_NAME);
exit(EXIT_FAILURE);
}
}
printf("Process %d opening FIFO O_WRONLY\n", getpid());
pipe_fd = open(FIFO_NAME, O_WRONLY); //打开有名管道
printf("the file's descriptor is %d\n", pipe_fd);
if(pipe_fd != -)
{
res = write(pipe_fd, buffer, sizeof(buffer)); //写数据
if(res == -)
{
fprintf(stderr, "Write error on pipe\n");
exit(EXIT_FAILURE);
}
printf("write data is %s, %d bytes is write\n", buffer, res);
close(pipe_fd);
}
else
exit(EXIT_FAILURE);
printf("Process %d finished\n", getpid());
exit(EXIT_SUCCESS);
}

读进程

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/stat.h> #define FIFO_NAME "/tmp/my_fifo" //要创建的有名管道的路径
int main(int argc, char * argv[])
{
int pipe_fd;
int res;
char buffer[];
int bytes_read = ;
memset(buffer, '\0', sizeof(buffer));
printf("Process %d opening FIFO O_RDONLY\n", getpid());
pipe_fd = open(FIFO_NAME, O_RDONLY); //打开有名管道
printf("the file's descriptor is %d\n", pipe_fd);
if(pipe_fd != -)
{
bytes_read = read(pipe_fd, buffer, sizeof(buffer));
printf("the read data is %s\n", buffer);
close(pipe_fd);
}
else
exit(EXIT_FAILURE);
printf("Process %d finished, %d bytes read\n", getpid(), bytes_read);
exit(EXIT_SUCCESS);
}

运行时,先在一个终端运行写进程,此时写进程会阻塞。

ctrl+alt+[F1-F6]切换终端,在新终端运行读进程。

读进程端结果为

再切换回原终端,写进程也执行完毕。

【linux高级程序设计】(第九章)进程间通信-管道 3的更多相关文章

  1. linux高级应用第九章-正则表达式

    笔记部分 基础正则表达式: ^   第1个符号 ,以什么什么开头   ^m $  第2个符号,以什么什么结尾  m$    ,还表示空行,或空格,可以用cat  -An 试一下 ^$ 第3个符号,空行 ...

  2. javascript高级程序设计第二章知识点提炼

    这是我整理的javascript高级程序设计第二章的脑图,内容也是非常浅显与简单.希望您看了我的博客能够给我一些意见或者建议.

  3. 鸟哥的linux私房菜——第九章学习(vim编辑器)

    第九章vim编辑器 1.0).vi与vim Linux下文本界面的文书编辑器通常会有常常听到的就有: emacs, pico, nano, joe, 与 vim 等等. vi的优势: 所有的 Unix ...

  4. 鸟哥的Linux私房菜——第九章

    视频链接,推荐看B站 土豆网:http://www.tudou.com/programs/view/XmMDbjJHJC8 B站:http://www.bilibili.com/video/av966 ...

  5. 【linux高级程序设计】(第九章)进程间通信-管道 1

    Linux操作系统所支持的主要进程间的通信机制. 无名管道 PIPE cat test.txt| grep hello 上面这种管道,将一个命令的输出作为另一个命令的输入,而这种管道是临时的,命令执行 ...

  6. 【linux高级程序设计】(第九章)进程间通信-管道 2

    文件描述符重定向 cat<test01  :将输入重定向到test01文件 cat>test02<test01  :将标准正确输出重定向到test02文件,输入设备重定向到test0 ...

  7. 【linux高级程序设计】(第十一章)System V进程间通信 4

    共享内存 共享内存主要用于实现进程间大量数据传输. 共享内存的数据结构定义: 系统对共享内存的限制: 共享内存与管道的对比: 可以看到,共享内存的优势: 1.共享内存只需复制2次,而管道需要4次 2. ...

  8. 【linux高级程序设计】(第十一章)System V进程间通信 2

    消息队列 消息队列是消息的链式队列,模型如下: 包括两种数据结构: msqid_ds消息队列数据结构 msg消息队列数据结构 struct msg_msg{ struct list_head m_li ...

  9. 【linux高级程序设计】(第十一章)System V进程间通信 1

    System V, 曾经也被称为 AT&T System V,是Unix操作系统众多版本中的一支. 传统上,System V 被看作是两种UNIX"风味"之一(另一个是 B ...

随机推荐

  1. Hihocoder 1275 扫地机器人 计算几何

    题意: 有一个房间的形状是多边形,而且每条边都平行于坐标轴,按顺时针给出多边形的顶点坐标 还有一个正方形的扫地机器人,机器人只可以上下左右移动,不可以旋转 问机器人移动的区域能不能覆盖整个房间 分析: ...

  2. Django 2.0官方文档中文 总索引

    Django 2.0官方文档中文 渣翻 总索引 翻译 2017年12月08日 11:19:1 官方原文: https://docs.djangoproject.com/en/2.0/ 当前翻译版本:  ...

  3. 批量修改Linux文件夹下所有文件大小写

    小写转大写: [zengs@SYS SOS]$ for cpplive in *; do mv $cpplive `echo $cpplive|tr [a-z] [A-Z]`; done 大写转小写: ...

  4. 设置虚拟wifi,手机和电脑可以连接

    在家里没有wifi,笔记本电脑又是宽带连接,有时候手机流量用得很快,于是网上找了一下设置虚拟wifi 方法. 1.首先你的电脑上要有无线网卡,并且无线网上一定要是开户的,一般默认的都开启,如果没有开启 ...

  5. +(void)load; +(void)initialize;有什么用处?

    总得来说: 1.+load方法是在main函数之前调用的: 2.遵从先父类后子类,先本类后列类别的顺序调用: 3.类,父类与分类之间的调用是互不影响的.子类中不需要调用super方法,也不会调用父类的 ...

  6. 《算法》C++代码 Floyd

    今天写写最短路径的Floyd算法(有翻译叫弗洛伊德,不过这奇葩翻译用来读读就好……). 这个算法的实质,广义来讲,其实是DP(动态规划).其实按说,算法应该先说说什么贪心.搜索.DP.二分之类的基本算 ...

  7. Python之进程、线程、协程

    进程和线程的目的 进程和线程目的是为了:提高执行效率 现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统. 什么叫“多任务“呢?简单地说,就是操作系 ...

  8. windows下使用RoboCopy命令进行文件夹增量备份

    RoboCopy,它是一个命令行的目录复制命令,自从Windows NT 4.0 开始就成为windows 资源工具包的一部分,然后在Windows Vista.Windows 7和 Windows ...

  9. Oracle 学习---- 练习语法 循环( loop end loop; for ;while; if elsif end if )

    /*--set serveroutput on;declare mynum number(3) :=0; tip varchar2(10):='结果是 ';begin mynum:=10+100; d ...

  10. glance参数

    Image service property keys https://docs.openstack.org/python-glanceclient/latest/cli/property-keys. ...