理解原子操作
题目
编写一个程序,最多可接收3个命令行参数:
$ ./5-3 filename num-bytes [-x] |
该程序打开指定的文件,然后每次写入一个字节的方式,向尾部追加num-bytes字节。缺省情况下,打开文件的标志应有O_APPEND,但若存在第三个命令行参数,那么就使用lseek到文件末尾再进行写入。最后运行这两个命令查看结果:
./5-3 f1 1000000 & ./5-3 f1 1000000
和
./5-3 f1 1000000 -x & ./5-3 f1 1000000 -x
代码
|
结果
不带-x参数
$ ./5-3 f1 1000000 & ./5-3 f1 1000000
$ ls -lh f1
-rw-rw-r-- 1 zqh zqh 2.0M 5月 9 10:38 f1带-x参数
$ ./5-3 f1 1000000 -x & ./5-3 f1 1000000 -x
$ ls -lh f1
-rw-rw-r-- 1 zqh zqh 1010K 5月 9 10:46 f1总结
使用O_APPEND参数打开的文件属于原子操作,两个不同的进程对一个文件做输入,是不可分割的操作 使用lseek操作,不属于原子操作。
扩展
我尝试修改了这个程序名为5-3.1,并且查看结果 | | 原程序 | 新程序 | |-- |----------|----------| |无 -x |写入a |写入b | |有 -x |写入x |写入y |
- 不带-x参数