在我最近学习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 不就好了
恍然大悟 我真是个智障