我正在研究如何使用多執行緒來處理任務。我注意到fifo檔案可以幫助做到這一點。效果如下:
#!/bin/bash
my_cmd(){
echo "process $1"
sleep 3
}
ff="d:/myfifo/$$.fifo"
mkfifo $ff
exec 7<>$ff
for i in {1..10};do echo;done >&7
for i in {1..1000};do {
read -u 7
my_cmd $i
echo >&7
}& done
rm $ff
wait
echo "end"
這個shell腳本可以正常運行(處理1000個cmds,一次10個)。我稍微修改了這個腳本
#!/bin/bash
my_cmd(){
echo "process $1"
sleep 3
}
ff="d:/myfifo/$$.fifo"
mkfifo $ff
exec 7<>$ff
for i in {1..10};do echo;done >$ff # modified
for i in {1..1000};do {
read <$ff # modified
my_cmd $i
echo >$ff # modified
}& done
wait
rm $ff
echo "end"
不出所料,第二個腳本也可以正常運行,但是我再次修改時出錯了。
#!/bin/bash
my_cmd(){
echo "process $1"
sleep 3
}
ff="d:/myfifo/$$.fifo"
mkfifo $ff
# exec 7<>$ff modified
for i in {1..10};do echo;done >$ff
for i in {1..1000};do {
read <$ff
my_cmd $i
echo >$ff
}& done
wait
rm $ff
echo "end"
腳本等待輸入到fifo檔案,因為fifo檔案進入阻塞狀態。似乎這個命令'exec 7<>$ff'解除了這個fifo檔案的阻塞狀態。所以是這樣嗎?
uj5u.com熱心網友回復:
至少在 Linux 上(不確定其他作業系統,并且 POSIX 沒有定義行為),打開用于讀取和寫入的 fifo 將立即成功,而不會阻塞等待管道的另一端打開。
因此,當您注釋掉該exec 7<>$ff行時,下一行將for i in {1..10};do echo;done >$ff打開 fifo 進行寫入,并在繼續之前阻止等待其他東西打開它進行寫入。使用 的原始版本exec,它已經打開閱讀,所以沒有必要阻止。
在Linux的fifo(7)檔案做筆記
使用連接的兩端以與自身通信的行程應該非常小心以避免死鎖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/399245.html
