该测试程序可以保持文件常开条件下, 实现文件每次写入过程中,先清空文件,然后重置文件指针位置,最后写入新内容。读取文件也会重置文件指针位置,然后读最新文件内容。
ftruncate函数可以实现清空文件内容,清空之后使用lseek函数将文件指针偏移到传入字节数处
#include <iostream>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <thread>
using namespace std;
static int k = 0;
static int fd = -1;
void writeFile(int fd)
{
ftruncate(fd, 0); //清空文件
lseek(fd, 0, SEEK_SET); //将文件指针偏移到传入字节数处(文件头开始偏移)
char str = k + '0';
write(fd, &str, 1); //写入数据
k++;
return;
}
void readFile(int fd)
{
char* str = new char[10];
lseek(fd, 0, SEEK_SET); //将文件指针偏移到传入字节数处(文件头开始偏移)
read(fd, str, sizeof(*str)/sizeof(char));//读取数据
cout << (*str) << endl;
return;
}
void writeRun()
{
while (1)
{
usleep(500000); // 100ms
writeFile(fd);
}
return;
}
void readRun()
{
while (1)
{
usleep(500000); // 100ms
readFile(fd);
}
return;
}
int main(int argc, char* argv[])
{
char filePath[30];
snprintf(filePath, 30, "%s", "./continue_work.ini");
fd = open(filePath, O_RDWR | O_CREAT | O_TRUNC, 0666);//打开文件
thread readThread(readRun);//创建读取线程
readThread.detach();
thread writeThread(writeRun);//创建写入线程
writeThread.detach();
while (1)
{
usleep(500000);
}
close(fd);
return 0;
}