• 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


     

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


     


  • 相关阅读:
    mysql 初始密码 设置
    jsp基础知识(基本的语法及原理)
    hdu 2473 Junk-Mail Filter (并查集之点的删除)
    java版本的学生管理系统
    java操作数据库出现(][SQLServer 2000 Driver for JDBC]Error establishing socket.)的问题所在即解决办法
    Java学习之约瑟夫环的两中处理方法
    hdu 3367(Pseudoforest ) (最大生成树)
    hdu 1561 The more, The Better (树上背包)
    Nginx + Lua 搭建网站WAF防火墙
    长连接和短连接
  • 原文地址:https://www.cnblogs.com/chuxiking/p/1815929.html
Copyright © 2020-2023  润新知