shell 命名管道,进程间通信
命名管道基础
命名管道也被称为FIFO文件, 在文件系统中是可见的,并且跟其它文件一样可以读写!
命名管道特点:
当写进程向管道中写数据的时候,如果没有进程读取这些数据,写进程会堵塞
当读取管道中的数据的时候,如果没有数据,读取进程会被堵塞
当写进程堵塞的时候,有读进程读取数据,那么写进程恢复正常
当读进程堵塞的时候,如果写进程写了数据,那么读进程会读取数据,然后正常执行后面的代码
# 写进程堵塞的情况
[root@ns_10.2.1.242 test]$ echo 1 >p &
[1] 17091
[root@ns_10.2.1.242 test]$ jobs
[1]+ Running echo 1 > p &
[root@ns_10.2.1.242 test]$ cat p
1
[1]+ Done echo 1 > p
[root@ns_10.2.1.242 test]$ jobs
[root@ns_10.2.1.242 test]$ # 读进程堵塞的情况
[root@ns_10.2.1.242 test]$ cat p &
[1] 17351
[root@ns_10.2.1.242 test]$ jobs
[1]+ Running cat p &
[root@ns_10.2.1.242 test]$ echo 2 > p
2
[root@ns_10.2.1.242 test]$ jobs
[1]+ Done cat p
命名管道的作用,不同的进程之间通信,比如在后台执行一个备份进程,然后执行另外一个进程,等待备份完成才会处理想对应的事情!
创建管道的命令:
$ mkfifo /tmp/testpipe
$ mknod /tmp/testpipe p
下面是命名管道的一个应用例子:
reader.sh读取管道的内容,代码如下:
#!/bin/bash
# filename: reader.sh
# 逐行读取管道中的内容
pipe=/tmp/testpipe
trap "rm -f $pipe" EXIT
if [[ ! -p $pipe ]]; then
    mkfifo $pipe
fi
while true
do
    if read line <$pipe; then
        if [[ "$line" == 'quit' ]]; then
            break
       	else
            echo $line
		fi
    fi
done
echo "Stop reader...."
writer.sh写数据到管道,代码如下:
#!/bin/bash
# writer.sh
# 把当前进程的pid写到管道
pipe=/tmp/testpipe
if [[ ! -p $pipe ]]; then
    echo "Reader not running"
    exit 1
fi
if [[ "$1" ]]; then
    echo "$1" >$pipe
else
    echo "Hello from $$" >$pipe
fi
reader和writer调用的例子:
[root@ns_10.2.1.242 test]$ sh reader.sh &
[1] 17053
[root@ns_10.2.1.242 test]$ sh writer.sh test
test
[root@ns_10.2.1.242 test]$ sh writer.sh
Hello from 17057
[root@ns_10.2.1.242 test]$ sh writer.sh quit
stop Reader
[root@ns_10.2.1.242 test]$ sh writer.sh quit
Reader not running
[1]+  Done                    sh reader.sh
[root@ns_10.2.1.242 test]$ sh writer.sh quit
shell 中的$$是当前进程的进程ID
shell 命名管道,进程间通信的更多相关文章
- shell 命名管道,进程间通信, ncat作http server
		
命名管道基础 命名管道也被称为FIFO文件, 在文件系统中是可见的,并且跟其它文件一样可以读写! 命名管道特点: 当写进程向管道中写数据的时候,如果没有进程读取这些数据,写进程会堵塞 当读取管道中的数 ...
 - shell 匿名管道和命名管道
		
管道的特点:如果管道中没有数据,那么取管道数据的操作就会滞留,直到管道内进入数据,然后读出后才会终止这一操作:同理,写入管道的操作如果没有读取管道的操作,这一动作也会滞留. 1,匿名管道 匿名管道使用 ...
 - Linux进程间通信(四):命名管道 mkfifo()、open()、read()、close()
		
在前一篇文章—— Linux进程间通信 -- 使用匿名管道 中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关 ...
 - Linux进程间通信-命名管道
		
前面我们讲了进程间通信的一种方式,匿名管道.我们知道,匿名管道只能用于父子关系的进程之间.那么没有这种关系的进程之间该如何进行数据传递呢? 1.什么是命名管道 匿名管道是在缓存中开辟的输出和输入文件流 ...
 - Linux进程间通信——使用命名管道
		
在前一篇文章——Linux进程间通信——使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程 ...
 - Linux环境进程间通信(一):管道及命名管道
		
linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...
 - 【windows 操作系统】进程间通信(IPC)简述|无名管道和命名管道 消息队列、信号量、共享存储、Socket、Streams等
		
一.进程间通信简述 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进 ...
 - 【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行
		
背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比 ...
 - Linux系统编程——进程间通信:命名管道(FIFO)
		
命名管道的概述 无名管道,因为没有名字,仅仅能用于亲缘关系的进程间通信(很多其它详情.请看<无名管道>).为了克服这个缺点.提出了命名管道(FIFO).也叫有名管道.FIFO 文件. 命名 ...
 
随机推荐
- [LeetCode129]Sum Root to Leaf Numbers
			
题目: Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a nu ...
 - Linux curl使用简单介绍 (转)
			
Curl是Linux下一个很强大的http命令行工具,其功能十分强大. 1) 二话不说,先从这里开始吧! $ curl http://www.linuxidc.com 回车之后,www.linuxid ...
 - UIControl-IOS发展
			
UIKit提供了一组控件:UISwitch开关.UIButtonbutton.UISegmentedControl分段控件.UISlider滑块.UITextField文本字段控件. UIPageCo ...
 - UVa10000_Longest Paths(最短路SPFA)
			
解题报告 求最长路. 用SPFA求最长路,初始化图为零,dis数组也为零 #include <iostream> #include <cstdio> #include < ...
 - CentOS6.5设备MRBS
			
//--------------------------------------软件必须安装-----------------------------------// # yum install –y ...
 - struts 1.x 原理
			
Struts 当我接触到这个框架的时候.我就在想为什么是struts,而不是什么CraigFramework.结构.支撑,这样来理解也不难怪了. 为什么须要struts? 在struts in act ...
 - SDUT 2894-C(最短spfa)
			
C Time Limit: 7000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 给出一个带权无向图.包括n个点,m条边.求出s,e的最短路.保证最短路存在 ...
 - uva 10817 - Headmaster's Headache ( 状态压缩dp)
			
本文出自 http://blog.csdn.net/shuangde800 题目链接: 点击打开链接 题目大意 某校有n个教师和m个求职者,已知每人的工资和能教的课程集合,要求支付最少的工资使得每 ...
 - MyBatis与Spring设置callSettersOnNulls
			
项目中集成Mybatis与Spring,使用的是Mybatis3.2.7,以及Spring4.0.5,mybatis-spring-1.2.2;由于项目组成员想要偷懒,将数据从DB中查询出来时须要将字 ...
 - JAVA学习篇--JSTL基金会
			
JSTL什么 JSTL(JSP Standard TagLibrary,JSP标准标签库)是一个不断完好的开放源码的JSP标签库. 为什么要用JSTL 我们JSP用于开发信息展现页很方便;也能够嵌入j ...