⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p10-4.c

📁 SUN Solaris8平台下进程间通信
💻 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 + -