文件的原子操作
每个进程的维护Linux下时task_struct ,其中有一个记录项,
记录项是一个文件指针,指向一个文件描述符表,文件描述表相关联的是文件文件描述符标志和指向文件表项的指针
内核为所有打开的文件维护一张文件表项,与之相关连的是文件状态标志,当前文件偏移量,指向该文件v节点的指针
每个打开的文件都有一个v节点结构,v节点包含了文件类型对文件进行各种操作的函数,例如open,write等等,i 节点,当前文件长度
每个进程都有自己的文件表项的理由是:这种安排使得每个进程都有它对该文件的当前偏移量
这里有一个问题,如果两个进程,打开了同一个文件,那么他们的结构是怎样的呢?
这会有什么结果呢?
试想一下,一对父子进程同时打开了一个文件,文件的结构就是图上所示,假设父进程此时打开文件,在设置文件偏移量为1500,子进程现在切换,lseek设置文件偏移量为1500,然后进行write,到1600,若此时进程切换,又回到父进程,此时是1500,这时,父子进程操作文件就出来现问题。
linux系统是如何解决的呢?
答案就是在每次进程调用打开文件时,设置O_APPEND标志,每次对文件进行写时,都将调用sleek,将文件偏移量设置为文件结尾处。