关于open操作的O_EXCL的存在应用价值理解

来源:互联网 发布:淘宝运费险是自动退吗 编辑:程序博客网 时间:2024/05/20 08:01

在我最近学习Linux C的过程中  总是看到这样的打开方式   open(const* pathname,O_CREAT|O_EXCL);

O_CREAT  简单  就是想打开的文件如果不存在的话就会自动创建文件

而  O_EXCL   他的作用就是如果要创建一个文件   并且这个文件已经存在的话   会直接返回     并且  如果打开的文件是符号链接文件的话  也会直接返回  

一开始真的感觉莫名其妙

之后搜了一下才知道自己的菜逼思维


如果不加O_EXCL 的话  如果文件存在   那么这个文件依旧会被打开

此时我们假设有这样的一个需求:某个任务只能单个进程处理执行   多进程会影响到该任务的执行

为了不让多进程打开处理这个文件  并且不用O_EXCL的话 

可能会这样写

if( access(file, R_OK) == -1 )   /* 首先检查文件是否存在 */
    open(file, O_RDWR | O_CREAT,0666);  /* 如果不存在,那我创建一个这样的文件 */
...  /* 继续执行任务 */

其实这个逻辑存在一个潜在性错误的

如果当我的进程1执行了access并判断这个文件并不存在   由于操作系统关于多进程的调度策略  若此时进程1暂停    进程2执行  那么进程2也会判定这个文件不存在

结果自然是有两个进程会打开这个文件   这与我们的目标相违背


而相对的  如果我们用了 O_EXCL   我们就把判断和创建放在了一起    就能避免这个错误的发生



                                                                                                                                                                                                                           ---------------  一个小白的粗浅理解,欢迎指出错误



另外说个题外的内容   傻逼了  看这些源代码的时候一直看到  errno 的判断    然后就傻兮兮的去记所有的错误代码       记到恶心

然后有个煞笔告诉我直接   对  errno.h  grep 不就好了

恍然大悟   我真是个智障

1 0