Shell 五 併發控制

2021-10-24 04:39:25 字數 3782 閱讀 4273

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命令序列執行,如果命令耗時較長導致總時間較長...