【发布时间】:2014-07-17 07:03:32
【问题描述】:
我正在尝试构建一些简单的东西来测试文件锁定。我尝试打开两个文件进行写入,两个调用都完成。打开文件后显示:“hello world”。
#include <stdio.h>
int main() {
File *fp1 = fopen("./test.txt", "w");
fwrite("hello", 1, 5, fp1);
File *fp2;
if (fp2 = fopen("./test.txt", "w")) {
fwrite(" world", 1, 11, fp2);
}
}
从 fopen 的手册页中,我的印象是,如果打开文件进行写入,第二次调用将返回 null。我发现了一个类似的案例:Opening a file using fopen with same flag in C;按照 Adhip Gupta 的回答,我尝试检查
我也尝试使用 fcntl.h 中的 open()。当我期望第二次调用为 -1 时,打印了两个文件描述符。
#include <stdio.h>
#include <fcntl.h>
int main() {
int id1 = open("./text.txt", O_WRONLY);
int id2 = open("./text.txt", O_WRONLY);
printf("%d %d\n", id1, id2);
}
为什么会这样?我进行测试时没有关闭文件流/描述符;这可能是一个原因吗?
【问题讨论】:
-
fopen 手册页在什么系统上这么说?可以发个报价单吗?
-
只是因为手册页没有明确提到写入可以同时发生。我假设您不能打开两个文件进行写入,因为它会导致竞争条件。
-
尚不清楚此问题与竞态条件有何关系。如果您通过 same 句柄同时写入,您可能会遇到竞争条件。但是你有责任把它信号量化掉。