如果父进程和子进程追加到同一个文件,lseek() 和 write() 需要是原子的吗?
if parent and child processes append to same file, do lseek() and write() need to be atomic?
问题陈述
一个进程打开一个文件追加(假设没有O_APPEND,这里的追加是指先lseek()
到文件末尾再write()
),然后fork一个child。这两个相关进程同时附加到文件。假设 lseek()
和 write()
都是原子的。举个例子讨论在这种情况下lseek()
和write()
作为原子操作的必要性
我的想法
- 当前文件偏移量存储在打开文件 table 的条目中,并且该条目由 2 个相关进程共享。
write()
更新刚写入数据末尾的偏移量。
这两点保证即使在下面的场景中,P2
写入的数据也不会被P1
覆盖。
P1 lseek()
P2 lseek()
P2 write() // after this operation, the offset still points to the file end
P1 write()
我的问题
那么,在这种特定情况下,lseek()
和 write()
是否仍需要是一个原子操作?
原来是措辞让我质疑自己。
答案是在这种特定情况下它们不必是原子操作。
问题陈述
一个进程打开一个文件追加(假设没有O_APPEND,这里的追加是指先lseek()
到文件末尾再write()
),然后fork一个child。这两个相关进程同时附加到文件。假设 lseek()
和 write()
都是原子的。举个例子讨论在这种情况下lseek()
和write()
作为原子操作的必要性
我的想法
- 当前文件偏移量存储在打开文件 table 的条目中,并且该条目由 2 个相关进程共享。
write()
更新刚写入数据末尾的偏移量。
这两点保证即使在下面的场景中,P2
写入的数据也不会被P1
覆盖。
P1 lseek()
P2 lseek()
P2 write() // after this operation, the offset still points to the file end
P1 write()
我的问题
那么,在这种特定情况下,lseek()
和 write()
是否仍需要是一个原子操作?
原来是措辞让我质疑自己。
答案是在这种特定情况下它们不必是原子操作。