open,read,wirte与lseek的一些注意点
当open("a.txt",mode),mode指定为O_RDONLY或者O_WRONLY或者O_RDWR时,是从文件开头开始读或写的,当指定为O_APPEND时是从末尾开始读写的。使用O_RDWR时,如果先读了一段再写,那么写的位置从读完处开始,同理先写了一段再读,那么读的位置从写完处开始。可以使用lseek来改变文件位置指针,即读写的位置。
注意,当有多个进程同时对一个文件使用lseek和write来写入数据时,会出现竞争的情况,因为lseek和write的调用是独立的系统调用,内核可以随时打断进程,从而可能出现达不到期望的写入结果的情况。如果open的时候以O_APPEND状态,那么write的时候,就相当于在不加O_APPEND时候,lseek和write结合在一起成为一个原子操作,不再被分开。
open的参数
O_EXCL:O_EXCL标志防止两个进程创建相同的文件,如果文件存在且O_EXCL被置位,则返回-1.
O_CREAT:如果文件不存在,创建该文件。
当创建一个文件的时候,进程先会调用stat来检查文件是否存在,如果不存在就调用creat来创建,如果多个进程创建同一个文件,则会出现上述两个过程被打断的情况,于是问题就出现了。O_EXCL|O_CREAT结合可以使上述两个过程形成院子操作,避免多个进程创建同一个文件。

浙公网安备 33010602011771号