linux文件操作C编程小例
时间:2010-09-02 来源:楚夕
模拟买票系统,调用linux文件锁进行操作
在linux下打开两个终端,分别运行该程序,进入买票状态时将数据文件锁定,可用来防止数据共享错误
#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);
}
}
}