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)
    }

  • 相关阅读:
    网页布局——table布局
    Flex 布局——语法属性详解
    CSS实现垂直居中的几种方法
    svn:冲突(<<<<<<.mine ==== >>>>>>.xxxx)
    mysql:4种时间类型
    js:"use strict"; 严格模式
    js函数的Json写法
    spring 官方文档
    mybatis技术文章
    java:可变参数(转载)
  • 原文地址:https://www.cnblogs.com/len3d/p/1593446.html
Copyright © 2011-2022 走看看