在我最近学习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 不就好了

恍然大悟 我真是个智障

Categories: C

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Related Posts

C

setjmp 与 longjmp

最近看到C看到一个很让人费解的函数组合 setjmp 和 longjm Read more…