zoukankan      html  css  js  c++  java
  • 多进程共享文件

    一种方法是使用文件锁,利用fcntl函数对于文件进行加锁解锁操作,以达到互斥访问的目的,但是在控制时需要注意进程之间的关系,在有多个进程和共享资源时,应注意死锁的避免。
    上一个最开始写的程序吧,简单,就是两个进程互斥访问文件。

    #include <iostream>
    #include <sys/types.h>
    #include <unistd.h>
    #include <fcntl.h>

    void readfile(FILE*fd);
    void writefile(FILE*fd);
    int lock_file(int fd,int cmd,int type,off_t offset,int whence,off_t len);

    using namespace std;

    int main()
    {
        FILE* fd;
        //fd=fopen("./test_file","a+");
        if(fork()>0)
        {
            writefile(fd);
        }else
         {
             readfile(fd);
         }
        fclose(fd);
    }

    void fileop1(FILE* fd)
    {
        while(lock_file(fileno(fd),F_SETLK,F_WRLCK,0,SEEK_SET,0)<0)
        {
            sleep(1);
            perror("FILEOP1 TRY LOCK");
        }
        cout<<"fileop1 locked"<<endl;
        sleep(5);
        if (lock_file(fileno(fd),F_SETLK,F_UNLCK,0,SEEK_SET,0)<0)
        {
            perror("UNLOCK FAILED");
        }
    }

    void fileop2(FILE* fd)
    {
        while(lock_file(fileno(fd),F_SETLK,F_WRLCK,0,SEEK_SET,0)<0)
        {
            sleep(1);
            perror("FILEOP2 TRY LOCK");
        }
        cout<<"fileop2 locked"<<endl;
        sleep(5);
        if (lock_file(fileno(fd),F_SETLK,F_UNLCK,0,SEEK_SET,0)<0)
        {
            perror("UNLOCK FAILED");
        }
    }

    int lock_file(int fd,int cmd,int type,off_t offset,int whence,off_t len)
    {
        struct flock lock;
        lock.l_type=type;
        lock.l_start=offset;
        lock.l_whence=whence;
        lock.l_len=len;
        return(fcntl(fd,cmd,&lock));
        //if(lock_file(LockFD,F_SETLK,F_WRLCK,0,SEEK_SET,0)
    }

  • 相关阅读:
    第3章 管道符、重定向与环境变量
    基于Linux命令行KVM虚拟机的安装配置与基本使用
    Linux系统真正的优势以及学习方法
    一款在线编写接口文档的工具
    springboot前端传参date类型后台处理方式
    软件工程专业需要知道的缩写和专业名词
    七牛云图床及MPIC工具使用
    阿里云ECS云服务器CentOS部署个人网站
    【字】biang
    【车】打开车窗技巧
  • 原文地址:https://www.cnblogs.com/tianlangshu/p/5200651.html
Copyright © 2011-2022 走看看