shell 多进程

一、文件描述符

1)文件描述符是一个非负整数,而内核需要通过这个文件描述符才可以访问文件。当我们在系统中打开已有的文件或新建文件时,内核每次都会给特定的进程返回一个文件描述符,当进程需要对文件进行读或写操作时,都要依赖这个文件描述符进行。文件描述符就像一本书的目录页数(也叫索引),通过这个索引可以找到需要的内容。在Linux或类UNIX系统中内核默认会为每个进程创建三个标准的文件描述符,分别是0(标准输入)、1(标准输出)和2(标准错误)。通过查看/proc/PID号/fd/目录下的文件,就可以查看每个进程拥有的所有文件描述符。

创建文件描述符的语法:
exec 文件描述符<>文件名
调用文件描述符语法:
&文件描述符
关闭文件描述符语法:
exec 文件描述符<&-
或者
exec 文件描述符>&-

定时文件描述符时> 和 < 判断文件描述符用于输入还是输出,如果此时只有用其中一个,那就是单工通信的。

2)read 可以从文件描述符中读取数据

read -u12 content

文件描述符并不是简单地对应一个文件的。文件描述符中还包含有很多文件相关的信息,如权限、文件偏移量等。文件偏移量更像一个指针,它指向某个文件的位置,默认情况下该指针指向的是文件的起始位置,当使用read命令读取一行数据后,该指针会指向下一行数据,再使用read读取一行内容,指针再往下移动一行,依此类推,直到文件结束。

因为cat命令会读取文件的全部内容,所以当我们使用cat命令读取文件描述符时,文件描述符的指针会一次性跳到文件的末尾,一旦到了文件末尾,则再通过文件描述符读取文件的内容就为空,因为没有内容可读了。但是可以重新打开文件描述符,还可以再次从开始位置读取数据内容。

同样的道理,也可以每次仅读取文件的任意个字符。这样的话,指针就会停留在特定字符的后面,等待下一次再通过文件描述符读取文件内容时,就会继续从这个位置读取后续的内容。read命令可以通过-n选项指定读取任意字符的数据。

 

二、命名管道

管道是进程间通信的一种方式,前面已经介绍了匿名管道,使用|符号就可以创建一个匿名管道,顾名思义,系统会自动创建一个可以读写数据的管道,但是这个管道并没有名称。一个程序往管道中写数据,另一个程序就可以从管道中读取数据。但是匿名管道仅可以实现父进程与子进程之间的数据交换,能不能实现任意两个无关的进程之间的通信呢?答案是肯定的,使用命名管道,也叫FIFO文件。

命名管道具有如下几个特征:

● FIFO文件由命令创建(mknod或mkfifo命令),可以在文件系统中直接看到。

● 写入管道的数据一旦被读取后,就不可以再重复读取。

● 进程往命名管道中写数据时,如果没有其他进程读取数据,则写进程会被阻塞。

● 进程尝试从命名管道中读取数据时,如果管道中没有数据,则读进程会被阻塞。

● 命名管道中的数据常驻内存,并不实际写入磁盘,读写效率会更高。

 

三、多进程脚本

 

参考: linux shell核心编程指南 ,有需要的朋友可以自行阅读。

posted @ 2022-03-27 14:29  腐汝  阅读(357)  评论(0编辑  收藏  举报