zoukankan      html  css  js  c++  java
  • 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


     

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


     


  • 相关阅读:
    效能分析
    个人项目词频统计2
    PSP 进度条 柱状图 饼状图
    四人小组项目
    结对编程
    品评历届学生作品
    构建之法终于到手了
    补上周一的进度条进度条:
    燃尽图
    scrum站立会议
  • 原文地址:https://www.cnblogs.com/chuxiking/p/1815929.html
Copyright © 2011-2022 走看看