Linux文件描述符详解
1、关于文件描述符本身:
进程在打开一个文件后,会在当前进程内部生成文件的描述信息结构,并且会将其地址添加到pcb的文件描述符表中,而添加位置在文件描述符表当中的数组下标,就成为了我们的文件描述符,因此两个进程产生的文件描述符是互相独立的;在多个进程同时对文件进行读写时,操作系统并不保证写的原子性(原子性通常是指一个操作能够一次性完成,不会被操作系统打断,用来描述安全性);当两个进程读取同一个文件的时候,若一个进程将文件删除,另一个进程并不会立即读写失败,因为删除一个文件只是修改了文件系统中相应分组的block bitmap等描述其是否存在的信息,在data block中其信息不会改变,而另一个进程一直都知道应该到磁盘的什么位置去读取文件,因此并不会失败
2、文件描述符和文件流指针的关系:
文件流指针内部封装了文件描述符,是一个FILE*结构体指针,其对应的借口有fopen, fwrite,
fread, fclose等
文件描述符是系统调用接口操作句柄,对应的借口有open, write, read, close等
3、关于dup2重定向函数:
文件描述符表不同的位置可以存放相同的文件描述信息结构,因此就可以实现重定向操作;对于一个进程而言,两次打开同一文件其文件描述符不一定相同,因为系统是将文件描述符表的最低未使用位置的下标作为新文件的文件描述符,并不能保证这两次位置是相同的
4、关于重定向命令的写法,以在bash中,将demo.sh的标准输出和标准错误重定向到demo.log为例
标准写法:bash demo.sh 1 > demo.log 2 > &1
新奇方式:bash demo.sh >& demo.log 而这也等价于bash demo.sh &> demo.log
(这里&>表示将标准输出和标准错误进行重定向)
基本方式:bash demo.sh 2 > demo.log 1 > demo.log