Chinaunix首页 | 论坛 | 博客
  • 博客访问: 234282
  • 博文数量: 95
  • 博客积分: 400
  • 博客等级: 一等列兵
  • 技术积分: 906
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-04 16:04
个人简介

人生意义在于积累,而不是日复一日的重复

文章分类

全部博文(95)

文章存档

2016年(2)

2015年(44)

2014年(35)

2011年(5)

2010年(9)

我的朋友

分类: LINUX

2014-12-16 09:55:01

shell不存在真正的多进程或线程,它是通过后台执行来模拟多进程。通过后台执行进程可以实现多进程,但难以控制进程数,因此通过管道和文件描述符来实现。

实现多进程,这里要引入管道和文件操作符。

一、管道:通常使用的"|"是一种匿名管道,这里介绍命名管道,通过mkfifo命令可以创建命名管道,然后通过ls -l可以看到文件属性为p。

点击(此处)折叠或打开

  1. mkfifo fifo    #创建管道fifo
  2. echo "test" > fifo #向管道内写入数据
上述执行echo后会一直等待管道数据被读出后才会结束退出。再打开一终端,执行

点击(此处)折叠或打开

  1. cat fifo    #输出管道文件内容
上述示例为写入,再读出,写入会我等读出执行结束才会退出。反之,若先读,则读进程会等待写入执行完毕才会执行结束。

二、文件描述符
系统默认文件描述符有0,1,2分别代表stdin,stdout,stderr,在/proc/self/fd中看以看到其对应文件;
通过 ulimit -n 可以看到系统支持的文件描述符最大值,一般为65535,则可用的文件描述符为3~65534。

三、多进程

点击(此处)折叠或打开

  1. #!/bin/bash

  2. trap "exec 1024>&-; exec 1024<&-; exit 0" 2

  3. mkfifo fifo
  4. exec 1024<>fifo
  5. rm -f fifo
  6. threadnum=10

  7. for((i=0;i<$threadnum;i++))
  8. do
  9.     echo >&1024
  10. done

  11. while read line
  12. do
  13.     read -u1024
  14.     {
  15.         echo line;
  16.         echo >&1024
  17.     }&
  18. done < inputfile

  19. wait
  20. exec 1024>&-
  21. exec 1024<&-
第3行:通过Ctrl+C(即信号2)关闭文件描述符,并退出;创建时可通过<>来绑定文件描述符,但关闭时必须分开写;

第5~7行:创建管道,并与文件描述符绑定,为防止别人使用误用管道,可将管道文件删除;

第10~13行:根据需要创建的进程数,向管道中写入数据空行;

第15~22行:读取管道中的数据,并创建后台进程,进程执行完成后再向管道中输出一个穿行,以此保证后台进程数。

第24~26行:等待所有进程结束,并将释放文件描述符。


阅读(919) | 评论(0) | 转发(0) |
0

上一篇:shell数组

下一篇:淡定

给主人留下些什么吧!~~