標籤:linux shell 多線程
#!/bin/bash#a_sub(){ sleep 5}Multi_Thread(){ THREAD=5 # 此處定義線程數 TMP_FIFO="/tmp/$.fifo" /usr/bin/mkfifo $TMP_FIFO # 建立一個fifo類型的檔案 exec 6<>$TMP_FIFO /bin/rm -f $TMP_FIFO # 將fd6指向fifo類型 for ((i=0;i<$THREAD;i++));do /bin/echo done >&6 # 事實上就是在fd6中放置了$THREAD個斷行符號符}Sleep_Main(){ for ((i=0;i<50;i++));do # 50次迴圈,可以理解為50個主機,或其他 read -u6 # 一個read -u6命令執行一次,就從fd6中減去一個斷行符號符,然後向下執行 # fd6中沒有斷行符號符的時候,就停在這了,從而實現了線程數量控制 { # 此處子進程開始執行,被放到後台 a_sub /bin/echo >&6 # 當進程結束以後,再向fd6中加上一個斷行符號符,即補上了read -u6減去的那個 } & done wait # 等待所有的後檯子進程結束 exec 6>&- # 關閉df6 exit 0 }Multi_Thread Sleep_Main
此程式中的命令
mkfifo tmpfile
和linux中的命令
mknod tmpfile
效果相同。區別是mkfifo為POSIX標準,因此推薦使用它。該命令建立了一個先入先出的管道檔案,並為其分配檔案標誌符6。管道檔案是進程之間通訊的一種方式,注意這一句很重要
exec 6<>$TMP_FIFO # 將fd6指向fifo類型
如果沒有這句,在向檔案$TMP_FIFO或者&6寫入資料時,程式會被阻塞,直到有read讀出了管道檔案中的資料為止。而執行了上面這一句後就可以在程式運行期間不斷向fifo類型的檔案寫入資料而不會阻塞,並且資料會被儲存下來以供read程式讀出。
本文出自 “baby神” 部落格,請務必保留此出處http://babyshen.blog.51cto.com/8405584/1876312
Shell多線程編程的執行個體