• linux文件操作小例


    程序目的:模拟买票系统,调用linux文件锁进行操作


    程序分析:根据教材文件锁程序改编,当两个进程同时访问某一个数据文件,并且想要修改时锁住文件,一方操作,另一方等待,创新之处在于此处加入了对于文件函数的运用

    在linux下打开两个终端,分别运行该程序,进入买票状态时将数据文件锁定,可用来防止数据共享错误

    新建一个数据文件,里面预先写入    100


    #include<stdio.h>        /*文件预处理,包含标准输入输出库*/
    #include<stdlib.h>                 /*文件预处理,包含system函数库*/
    #include <unistd.h>
    #include <sys/file.h>
    #include <sys/types.h>
    #include <sys/stat.h>

    void lock_set(int fd, int type)
    {
      struct flock lock;
      lock.l_whence = SEEK_SET;
      lock.l_start = 0;
      lock.l_len =0;

      FILE * fp;

      int num,total;

      while (1){
        lock.l_type=type;

     /*如果选择买票,给文件上锁*/
        if ((fcntl(fd,F_SETLK,&lock))==0) {
           if(lock.l_type==F_WRLCK){
             printf("请输入您需要的票张数:");
             scanf("%d",&num);
             fp=fopen("/home/king/tickets","r+");
             fscanf(fp,"%d",&total);/*先读取文件中的剩余票数*/
             fclose(fp);/*关闭文件*/
             fp=fopen("/home/king/tickets","w+");/*重置文件为空白*/
             total=total-num;
             fprintf(fp,"%d",total);/*写入剩余票数*/
             fclose(fp);
             fcntl(fd,F_SETLK,&lock);/*重新上锁*/
            }

        else if(lock.l_type==F_UNLCK)
            printf("您已经退出\n");

        return;
        }

        fcntl(fd,F_GETLK,&lock); /*另一个进程要修改文件时,查看文件状态*/
        if(lock.l_type != F_UNLCK){
          printf("抱歉,该文件正被操作中,请稍候......\n");
          getchar();
          break;
        }
      }
    }


    int main()
    {
       int fd;
       int k;
       fd=open("/home/king/tickets", O_RDWR | O_CREAT, 0666);
       if (fd<0){
         perror("打开出错");
         exit(1);
       }

       while (1){
         printf("请输入您要的操作:\n");
         printf("1).查看车票\n");
         printf("2).购买车票\n");
         printf("3).退出买票\n");
         printf("4).退出系统\n");
         scanf("%d",&k);
         switch (k)    
         {
           case 1:
            system("cat /home/king/tickets");
            printf("\n");
            getchar();
            break;
           case 2:
            lock_set(fd,F_WRLCK);
            getchar();
            break;
           case 3:
            lock_set(fd,F_UNLCK);
            getchar();
            break;
           case 4:
            close(fd);
            exit(0);
          }
       }
    }


     


     

    终端1:

    king@ubuntu:~$ ./1
    请输入您要的操作:
    1).查看车票
    2).购买车票
    3).退出买票
    4).退出系统
    1
    100

    请输入您要的操作:
    1).查看车票
    2).购买车票
    3).退出买票
    4).退出系统
    2
    请输入您需要的票张数:5
    请输入您要的操作:
    1).查看车票
    2).购买车票
    3).退出买票
    4).退出系统
    3
    您已经退出
    请输入您要的操作:
    1).查看车票
    2).购买车票
    3).退出买票
    4).退出系统
    4

    终端2:

    king@ubuntu:~$ ./1
    请输入您要的操作:
    1).查看车票
    2).购买车票
    3).退出买票
    4).退出系统
    1
    100

    请输入您要的操作:
    1).查看车票
    2).购买车票
    3).退出买票
    4).退出系统
    2
    抱歉,该文件正被操作中,请稍候......

    请输入您要的操作:
    1).查看车票
    2).购买车票
    3).退出买票
    4).退出系统
    2
    抱歉,该文件正被操作中,请稍候......

    请输入您要的操作:
    1).查看车票
    2).购买车票
    3).退出买票
    4).退出系统
    1
    95
    请输入您要的操作:
    1).查看车票
    2).购买车票
    3).退出买票
    4).退出系统
    2
    请输入您需要的票张数:5
    请输入您要的操作:
    1).查看车票
    2).购买车票
    3).退出买票
    4).退出系统
    1
    90
    请输入您要的操作:
    1).查看车票
    2).购买车票
    3).退出买票
    4).退出系统
    3
    您已经退出
    请输入您要的操作:
    1).查看车票
    2).购买车票
    3).退出买票
    4).退出系统
    4


     

    个人想法:锁文件这一文件操作也许就是数据库中实现数据共享而不冲突的基础......
     


     


  • 相关阅读:
    Haproxy 配置项及配置实例-Haproxy入门教程
    Spring Boot 配置-Spring Boot教程深入浅出系列
    RMI 接口和类概述-RMI快速入门教程
    分布式和非分布式模型对比-RMI快速入门教程
    RMI分布式对象模型-RMI快速入门教程
    RMI介绍-RMI快速入门教程
    Qt编写可视化大屏电子看板系统17-柱状堆积图
    Qt开发经验小技巧161-165
    Qt编写安防视频监控系统60-子模块4云台控制
    MyBatis的关联映射,resultMap元素之collection子元素,实现一对多关联关系(节选自:Java EE企业级应用开发教程)
  • 原文地址:https://www.cnblogs.com/chuxiking/p/1815929.html
Copyright © 2020-2023  润新知