下面的文章是通过学习《Unix环境高级编程》总结的,内容摘抄或改自原书。
提到原子操作,首先想到的是这个操作是不可分割,不可中断的。在多进程(线程)过程中经常会出现写文件冲突这种头疼的情况。
Unix(Linux)中定义的原子操作能够解决这类的冲突。原子操作指的是由多步组成的操作,如果该操作原子的执行,则或者执行完所有步,或者一步也不执行,不可能只执行所有步的一个子集。
下面通过Unix的系统调用来看一下原子操作的好处:
我们需要编写一个函数,用来在文件末尾添加内容,下列代码可以实现:
- int fd;
- if((fd = open("test.txt", O_RDWR))==-1)
- printf("fd error");
- if(lseek(fd, 0, SEEK_END) == -1)//首先将指针移到文件末尾
- printf("seek error");
- if((write(fd, buf, 9)) != 9)//根据传过来的buf,写入文件
- printf("write error");
Unix提供了原子操作可以解决上述问题,该原子操作可以看作是将上述的两个操作封装而成的。其方法就是打开文件(open)时设置O_APPEND标志,这使得内核在每次对文件进行写入之前,都将进程的当前位移量设置到该文件的尾端处,于是在每次写之前就不需要使用lseek了。