程序目的:模拟买票系统,调用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
个人想法:锁文件这一文件操作也许就是数据库中实现数据共享而不冲突的基础......