file descriptors (fd,檔案描述符)或 檔案控制代碼:
程序使用檔案描述符來管理開啟的檔案
[root@tianyun ~]
# ls /proc/$$/fd
0 1 2 3 4
0, 1, and 2, known as standard input, standard output, and standard error
[root@tianyun ~]
# ll /proc/$$/fd
total 0
lr-x------ 1 root root 64 sep 6 13:32 0 -> /dev/pts/0
lrwx------ 1 root root 64 sep 6 13:32 1 -> /dev/pts/0
lrwx------ 1 root root 64 sep 6 13:32 2 -> /dev/pts/0
lrwx------ 1 root root 64 sep 6 15:38 255 -> /dev/pts/0
[root@tianyun ~]
# touch /file1
[root@tianyun ~]
# exec 6<> /file1 //開啟檔案
[root@tianyun ~]
# ll /proc/$$/fd
total 0
lr-x------ 1 root root 64 sep 6 13:32 0 -> /dev/pts/0
lrwx------ 1 root root 64 sep 6 13:32 1 -> /dev/pts/0
lrwx------ 1 root root 64 sep 6 13:32 2 -> /dev/pts/0
lrwx------ 1 root root 64 sep 6 15:38 255 -> /dev/pts/0
lrwx------ 1 root root 64 sep 6 13:32 6 -> /file1
[root@tianyun ~]
# echo "tianyun" > /proc/$$/fd/6
[root@tianyun ~]
# cat /proc/$$/fd/6
tianyun
[root@tianyun ~]
# cat /file1
tianyun
[root@tianyun ~]
# rm -rf /file1
[root@tianyun ~]
# ll /proc/$$/fd
total 0
lr-x------ 1 root root 64 sep 6 13:32 0 -> /dev/pts/0
lrwx------ 1 root root 64 sep 6 13:32 1 -> /dev/pts/0
lrwx------ 1 root root 64 sep 6 13:32 2 -> /dev/pts/0
lrwx------ 1 root root 64 sep 6 15:38 255 -> /dev/pts/0
lrwx------ 1 root root 64 sep 6 13:32 6 -> /file1 (deleted)
[root@tianyun ~]
# cat /proc/$$/fd/6 //即使刪除原始檔不應影響fd內容。
yangsheng
yangsheng
[root@tianyun ~]
# cp -rf /proc/$$/fd/6 /file1 //還原刪除的檔案
[root@tianyun ~]
# exec 6<&-
[root@tianyun ~]
# ll /proc/$$/fd
total 0
lr-x------ 1 root root 64 sep 6 13:32 0 -> /dev/pts/0
lrwx------ 1 root root 64 sep 6 13:32 1 -> /dev/pts/0
lrwx------ 1 root root 64 sep 6 13:32 2 -> /dev/pts/0
lrwx------ 1 root root 64 sep 6 15:38 255 -> /dev/pts/0
如何exec開啟乙個檔案
如何exec關閉乙個檔案(釋放檔案控制代碼)
當乙個檔案fd未被釋放,刪除原始檔也不會影響fd
匿名管道
[root@tianyun ~]
# rpm -qa |grep bash
命名管道
[root@tianyun ~]
# mkfifo /tmp/tmpfifo //mkfifo建立匿名管道 作用乙個終端輸入乙個終端輸出,只能作為一次輸出結果。 第二次輸入將會消失。
[root@tianyun ~]
# file /tmp/tmpfifo
/tmp/tmpfifo: fifo (named pipe)
[root@tianyun ~]
# tty
/dev/pts/0
[root@tianyun ~]
# rpm -qa > /tmp/tmpfifo
[root@tianyun ~]
# tty
/dev/pts/1
[root@tianyun ~]
# grep bash /tmp/tmpfifo
bash-4.1.2-14.el6.x86_64
#!/bin/bash
exec 7<
> /etc/hosts
exec 8<
> /etc/sysconfig/network
while
read -u 7 line
do
echo
$line
read -u 8 line2
echo
$line2
done
exec 7<
&- exec 8<
&-
#!/usr/bin/bash
#固定執行緒
read -p "請輸入執行緒數量:" xiancheng
xianchengfile=/root/nfs/xianchengfile
mkfifo
$xianchengfile //虛擬管道
exec 8<
>
$xianchengfile //檔案描述
rm -rf $xianchengfile
for i in
`seq $xiancheng`
doecho
>
&8 //將內容寫入到描述檔案中
done
for i in
doread -u 8 //read 讀取描述檔案中的內容
&done
wait
echo
"完成"
exec 8>
&- //釋放描述檔案
shell指令碼併發控制詳解
file descriptors fd,檔案描述符或檔案控制代碼 程序使用檔案描述符來管理開啟的檔案 檢視當前程序的fd 確定以下三點 如何exec開啟乙個檔案 exec 3 file1.txt 如何exec關閉乙個檔案 釋放檔案控制代碼 如果沒有釋放控制代碼,檔案刪除後描述符依然還在 exec 3...
使用Shell實現併發控制
思路就是建立乙個管道,往裡面寫入固定行數的資料,當程序進行操作之前先讀取一行,執行完操作寫入一行。即可實現可控程序數的併發操作。注意這個思路和訊號量的概念類似。usr bin bash ping02 thread 8 tmp fifofile tmp fifo mkfifo tmp fifofile...
Shell指令碼併發及併發數的控制
正常情況下,shell指令碼是序列執行的,一條命令執行完才會執行接下來的命令。如下 bin bash for i in seq 1 10 do echo i done echo end 指令碼執行的結果如下 123 4567 8910 end echo 1命令序列執行,如果命令耗時較長導致總時間較長...