保持文件常开,同时实现读写

 该测试程序可以保持文件常开条件下, 实现文件每次写入过程中,先清空文件,然后重置文件指针位置,最后写入新内容。读取文件也会重置文件指针位置,然后读最新文件内容。
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; 
} 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值