#!/bin/bash
trap "exec 1000>&-;exec 1000<&-;exit 0" 2
# trap 接收信号
# 当接收到信号2(SIGINT ),ctrl+c的动作,关闭1000的文件描述符
mkfifo testfifo
# 创建管道文件
exec 1000<>testfifo
# 绑定管道文件与文件描述符,解决管道文件,只读或只出会阻塞的问题
rm -rf testfifo
# 删除管道文件,1000文件描述符仍具有管道文件的功能
for ((n=1;n<=10;n++))
do
echo >&1000
done
# 1000文件描述符加入10个空行,效果如令牌桶,限制并发数量为10。
start=`date "+%s"`
for ((i=1;i<=50;i++))
do
read -u1000
{
echo success$i;sleep 2
echo >&1000
}&
done
# 并发任务50组,每次输出success,等待两秒。
# read -u1000使用1000文件描述符读取一行,拿一个令牌
# echo >&1000,拿走令牌,同样需加入一个令牌,保持令牌桶中的令牌数量。
# '&'后台执行,每次新开一个子进程执行任务,不阻塞。
wait
# 等待以上代码执行完毕,继续执行
end=`date "+%s"`
echo "TIME: `expr $end - $start`"
exec 1000>&-
exec 1000<&-
# 关闭文件描述符1000