📄 p10-4.c
字号:
#include <unistd.h>#include <stdio.h>#include <fcntl.h>#include <stdlib.h>#include "filelock.h"#include "err_exit.h"const char *test_file = "/usr/local/games/score.dat ";struct userid { char *user_name; int index; int score;};/* 读出并输出游戏得分记录 */void read_score(int fd, struct userid *user) { off_t offset; int len; struct userid user_record,comm_record; int record_len = sizeof(struct userid); /* 读取霸主得分,霸主得分记录位于文件的开始。首先置等待读锁 */ if (READW_LOCK(fd,0,SEEK_SET, record_len) == -1) err_exit("READ_LOCK error"); lseek(fd, 0L,SEEK_SET); read(fd, &comm_record, record_len); /* 释放读锁 */ if (UN_LOCK(fd, 0L,SEEK_SET, record_len) == -1) printf("Process %d - failed to unlock region\n"); /* 读取用户得分,用户得分记录在文件中的位置根据user的index算出 */ offset = user_record.index * record_len; lseek(fd, offset,SEEK_SET); read(fd, &user_record, record_len); /* 输出得分记录 */ scores_report(&comm_record, &user_record); return;}void record_score(int fd, struct userid *user, int value){ off_t offset; struct userid user_record,comm_record; int record_len = sizeof(struct userid); /* 确定用户得分记录在文件中的位置并读用户得分记录 */ offset = user->index * record_len; lseek(fd, offset,SEEK_SET); read(fd, &user_record, record_len); /* 若用户当前得分高于历史最高分,更新历史最高分;若还高于霸主得分,更改霸主记录 */ if (user_record.score < value ){ /* 更改历史最高分 */ user_record.score = value; write(fd, &user_record, record_len); /* 读取霸主得分,为此,首先设置等待写锁。,霸主得分记录位于文件的开始. */ if (WRITEW_LOCK(fd,0,SEEK_SET, record_len) == -1) err_exit("WRITEW_LOCK error"); lseek(fd, 0L, SEEK_SET); read(fd, &comm_record, record_len); /* 若新霸主诞生,更改霸主记录 */ if (comm_record.score < value){ comm_record.score = value; comm_record.user_name = user->user_name; lseek(fd, 0L, SEEK_SET); write(fd, &comm_record, record_len); } /* 释放写锁 */ if (UN_LOCK(fd, 0L,SEEK_SET, record_len) == -1) err_exit("UN_LOCK error"); } return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -