多进程写文件的共享问题: 多个进程对同一文件进行“定位-写-更新文件属性”时,i 节点的文件长度会变更,导致两个进程在写数据时,引发了数据覆盖等操作。 解决方法就是使用原子操作。
原子操作: * open或者create时,使用O_APPEND 标志,写之前必须将偏移量移动至尾处,这样可以保证数据不会被覆盖。记录日志时会比较常用 * 使用原子读写:pread 和 pwrite * 为防止“检测到文件不存在,则创建”被其他进程打断,创建文件时应使用 O_CREATE 和 O_EXCL 标志 * 复制已有描述符到新描述符使用 dup2(而非 fcntl) pread 无法中断其定位和读,读完后不更新文件指针位置 pwrite 无法中断其定位和写,写完后不更新文件指针位置 复制现有描述符 dup 和 dup2: 两个函数都返回值最小的可用描述符,但 dup2 使用时较特殊: int dup2(int filedes, int filedes2); 若 filedes2 未被打开,返回 filedes2 若 filedes2 已被打开,会先执行 close(fields2),之后再返回 filedes2 若 filedes = filedes2,不执行close,返回 filedes2 当要对磁盘上文件进行写操作时,流程: 1. 内容变更同步到缓冲区 2. 如果缓冲区未满,则等待新写入 3. 若缓冲区满,将缓冲区放入排队队列队首 4. 若缓冲区一直不在队首,则等待 5. 缓冲区到达队首,将变更内容刷至磁盘