shell 命名管道,進程間通信


命名管道基礎

命名管道也被稱為FIFO文件, 在文件系統中是可見的,並且跟其它文件一樣可以讀寫!

命名管道特點:

  1. 當寫進程向管道中寫數據的時候,如果沒有進程讀取這些數據,寫進程會堵塞

  2. 當讀取管道中的數據的時候,如果沒有數據,讀取進程會被堵塞

  3. 當寫進程堵塞的時候,有讀進程讀取數據,那么寫進程恢復正常

  4. 當讀進程堵塞的時候,如果寫進程寫了數據,那么讀進程會讀取數據,然后正常執行后面的代碼

     # 寫進程堵塞的情況
     [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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM