APUE文件IO总结,文件描述符、原子操作

文件描述符:当打开一个现存文件或者创建一个新文件时,内核向进程返回一个文件符,对于同一个文件,不同的进程可能代表着不同的文件描述符,假设文件A在进程B中的文件描述符为4,但是可能在进程C中文件描述符就为5了。

通常文件描述符0表示标准输入,1表示标准输出。

过程如下:每个进程在进程表中都有一张fd(文件描述符),当进程打开文件时,分配一个目前可用最小的fd给到文件,代表在此进程中文件的ID。v节点表信息是各进程中共有的,文件表中之所以不公用的原因是每个进程都有不同的当前文件位移量。

另外可以根据以下函数分配文件描述符:

int dup(int filedes);//分配一个最小当前可用的文件描述符

int duo2(int filedes, int filedes2);//调用时会先关闭filedes2再把filedes2赋值给fildes,然后filedes与filedes2公用文件表

int fcntl(int filedes,int cmd,...);

cmd包括五种

cmd=F_DUPFD(赋值一个现存的描述符)

cmd=F_GETFN或F_SETFD(获取/设置文件描述符标记)

cmd=F_GETFL或F_SETFL(获取/设置文件状态标志)

cmd=F_GETOWN或F_SETOWN(获取/设置异步I/O有权)

cmd=F_GETLK,F_SETLK或F_SETLKW(获取/设置记录锁)

来分配fd,

APUE文件IO总结,文件描述符、原子操作_第1张图片

原子操作:通俗一点讲原子是不可再分的,代表着任何一个多于1个函数调用的操作都不能成为原子操作。当文件共享时,原子操作就显得非常重要。

比如:进程A与B同时操作一个文件,A和B都在开始位置上(1A和1B),A通过write函数写入数据到第10行2A的位置,如果此时A挂起,B再从开始的地方写入10行,这时候就会产生数据的紊乱,10行2A的位置就被顶到20行2A2上.这就由于两个进程调用write时候没有关联,各自的文件表当前文件位移量不同(后面我们会说到),各执行各自的操作。这就不属于原子操作。

                        APUE文件IO总结,文件描述符、原子操作_第2张图片

如用O_APPEND标志打开一个文件,后续无论各个进程修改完数据,都会从最尾处写入。这就为原子操作。




你可能感兴趣的:(linux)