shell不存在真正的多进程或线程,它是通过后台执行来模拟多进程。
通过后台执行进程可以实现多进程,但难以控制进程数,因此通过管道和文件描述符来实现。
实现多进程,这里要引入管道和文件操作符。
一、管道:通常使用的"|"是一种匿名管道,这里介绍命名管道,通过mkfifo命令可以创建命名管道,然后通过ls -l可以看到文件属性为p。
-
mkfifo fifo #创建管道fifo
-
echo "test" > fifo #向管道内写入数据
上述执行echo后会一直等待管道数据被读出后才会结束退出。再打开一终端,执行
上述示例为写入,再读出,写入会我等读出执行结束才会退出。反之,若先读,则读进程会等待写入执行完毕才会执行结束。
二、文件描述符
系统默认文件描述符有0,1,2分别代表
stdin,stdout,stderr,在/proc/self/fd中看以看到其对应文件;
通过 ulimit -n 可以看到系统支持的文件描述符最大值,一般为65535,则可用的文件描述符为3~65534。
三、多进程
-
#!/bin/bash
-
-
trap "exec 1024>&-; exec 1024<&-; exit 0" 2
-
-
mkfifo fifo
-
exec 1024<>fifo
-
rm -f fifo
-
threadnum=10
-
-
for((i=0;i<$threadnum;i++))
-
do
-
echo >&1024
-
done
-
-
while read line
-
do
-
read -u1024
-
{
-
echo line;
-
echo >&1024
-
}&
-
done < inputfile
-
-
wait
-
exec 1024>&-
-
exec 1024<&-
第3行:通过Ctrl+C(即信号2)关闭文件描述符,并退出;创建时可通过<>来绑定文件描述符,但关闭时必须分开写;
第5~7行:创建管道,并与文件描述符绑定,为防止别人使用误用管道,可将管道文件删除;
第10~13行:根据需要创建的进程数,向管道中写入数据空行;
第15~22行:读取管道中的数据,并创建后台进程,进程执行完成后再向管道中输出一个穿行,以此保证后台进程数。
第24~26行:等待所有进程结束,并将释放文件描述符。
阅读(952) | 评论(0) | 转发(0) |