我正在尝试在写入文件时模拟竞争条件。这就是我正在做的事情。
- 在process1中以追加模式打开a.txt
- 在 process1 中写“hello world”
- 在 process1 中打印 ftell,即 11
- 让process1进入睡眠状态
- 在 process2 中以追加模式再次打开 a.txt
- 在 process2 中写入“hello world”(正确附加到文件末尾)
- 在 process2 中打印 ftell 为 22(正确)
- 在 process2 中写“再见世界”(这正确地附加到文件的末尾)。
- 进程2退出
- process1 恢复并打印其 ftell 值,即 11。
- 用 process1 写“再见世界” --- 我假设 process1 的 ftell 是 11,这应该覆盖文件。
但是,process1 的写入是写入文件末尾,进程之间没有写入争用。
我使用 fopen 作为fopen("./a.txt", "a+)
谁能告诉我为什么会出现这种行为以及如何在写入文件时模拟竞争条件?
进程1的代码:
#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h>
#include "time.h"
using namespace std;
int main()
{
FILE *f1= fopen("./a.txt","a+");
cout<<"opened file1"<<endl;
string data ("hello world");
fwrite(data.c_str(), sizeof(char), data.size(), f1);
fflush(f1);
cout<<"file1 tell "<<ftell(f1)<<endl;
cout<<"wrote file1"<<endl;
sleep(3);
string data1 ("bye world");;
cout<<"wrote file1 end"<<endl;
cout<<"file1 2nd tell "<<ftell(f1)<<endl;
fwrite(data1.c_str(), sizeof(char), data1.size(), f1);
cout<<"file1 2nd tell "<<ftell(f1)<<endl;
fflush(f1);
return 0;
}
在process2中,我已经注释掉了该sleep
声明。
我正在使用以下脚本运行:
./process1 &
sleep 2
./process2 &
谢谢你的时间。