命名管道基礎
命名管道也被稱為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
