文件IO详解(十二)---原子操作之创建文件

使用open打开文件时,使用 O_CREAT 标志的话,就会在不存在文件的情况下去创建文件。所以说实际应该是有两个操作,一个是判断文件是否存在,另一个就是创建文件;而且这两个操作是作为一个原子操作执行的。如果不是作为一个原子操作执行的,那么就会分解成如下的程序段:

如果不作为一个原子操作执行那么在多进程中可能会出问题,假设两个操作不是作为原子操作执行的,当进程A在判断文件不存在后,便被挂起,进程B得以执行,然后创建了文件且向其中写入了数据,然后进程A被恢复,接着执行creat函数试图创建文件,而此时由于文件已存在,其中的内容会被truncate(截断)为 0 。这就导致了进程B的数据被擦除,出现错误。

时间: 2024-11-07 19:43:12

文件IO详解(十二)---原子操作之创建文件的相关文章

文件IO详解(十)---文件共享(多进程之间、单进程之间)

在同一个进程中,实现文件共享的方法有两种: 多次使用open函数打开相同文件 使用dup/dup2函数或者fcntl函数 ======================================================== 对于第一种方法: 每次使用open函数打开文件时,操作系统内核中都会创建一个不同的文件表项(struct file结构体),但是这些不同的struct file结构体最终都会指向同一个struct inode结构体,因为一个文件只能对应唯一的一个struct in

文件IO详解(十五)---sync、fsync和fdatasync函数详解

在使用write函数向文件中写入数据的时候,并不是在调用了函数后数据就被写进了磁盘,操作系统在内核中设置了一块专门的缓冲区,数据会先被写入到内核的缓冲区中,等到缓冲区满了或者系统需要重新利用缓冲区的时候才会将此缓冲区排入到写队列中去,待到达队首的时候,将数据真正写入到磁盘当中.这就是延迟写,延迟写会造成缓冲区中的数据和磁盘中的数据之间的不同步. ======================================================= sync函数原型: fsync和fdat

(待续)文件IO详解(十六)---fcntl函数详解

fcntl函数是用来在进程中实现对文件的多种操作的函数,通过不同的命令可以实现不同的操作.常用的操作有复制文件描述符.为文件设置建议锁和获取设置文件控制标志等. ======================================================= 函数原型: ======================================================= 操作一:复制文件描述符实现文件共享 函数参数: fd:要操作的文件描述符 cmd:F_DUPFD ar

文件IO详解(十四)---dup函数和dup2函数详解

dup和dup2函数是在进程中用来复制文件描述符的,可以实现文件共享. ======================================================== 函数原型: 函数参数: oldfd:要被复制的文件描述符 newfd:在dup2函数中指定的新文件描述符 返回值: 调用成功返回新的文件描述符 调用失败返回 -1 ======================================================== 使用dup或者dup2函数实现文件共

文件IO详解(五)---open函数详解

open函数用来在进程中打开文件,如果成功则返回一个文件描述符fd. ======================================================= 函数原型: 函数参数: pathname:打开文件的路径名 flags:用来控制打开文件的模式 mode:用来设置创建文件的权限(rwx).当flags中带有O_CREAT时才有效. 返回值: 调用成功时返回一个文件描述符fd 调用失败时返回-1,并修改errno ==========================

文件IO详解(七)---lseek函数详解

lseek函数用来设置当前文件偏移量. ====================================================== 函数原型: 函数参数: fd:要操作的文件描述符 offset:基于whence参数的偏移量 whence:参考点位置 返回值: 调用成功时返回当前相对于文件开头的偏移量,以字节为单位 调用失败时返回 -1,并修改errno的值 ======================================================= when

文件IO详解(三)---Linux虚拟文件系统

http://blog.chinaunix.net/uid-14735472-id-2921377.html 讲解虚拟文件系统的一些数据结构以及之间的关系,有些地方看不懂 http://www.docin.com/p-941544538.html 讲解了进程打开文件时内核所建立的各种数据结构之间的联系 在给磁盘分区后,每个分区中都可以建立起各自独立的文件系统,建立的物理文件系统可以是相同的,也可以是不同的.那么不同的物理文件系统的组织数据的方式肯定是不同的,比如说ext2文件系统组织数据的方式是

文件IO详解(四)---标准输入、标准输出和标准错误

每个进程都会默认打开3个文件描述符,即0.1.2.其中0代表标准输入流.1代表标准输出流.2代表标准错误流.通常标准输入流对应着键盘的设备文件.标准输出流和错误流对应着显示器的设备文件.在编程中通常使用宏STDIN_FILENO.STDOUT_FILENO和STDERR_FILENO分别来代表0,1,2. 要注意一点: 0.1.2这三个文件描述符对应的是标准输入流.标准输出流和标准错误流而不是键盘设备文件和显示器设备文件.只是默认标准输入流对应着键盘设备文件,标准输出和错误对应着显示器设备文件.

文件IO详解(一)---ext2文件系统详解

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/26/2609649.html 讲解ext2整体的文件布局 http://www.cnblogs.com/peon/archive/2011/06/22/2086470.html 用实际磁盘中的数据来印证ext2文件系统的布局 磁盘存储数据的最小单元是扇区(Sector):ext2文件系统存储结构的最小单位是块(Block). ext2文件系统中文件的物理存储结构有三个基本组成部分:superb