mmap.c

来自「Linux程序设计(原书第2版)源码」· C语言 代码 · 共 63 行

C
63
字号
/*  We start by defining a RECORD structure    and then create NRECORDS versions each recording their number.    These are appended to the file records.dat.  */#include <unistd.h>#include <stdio.h>#include <sys/mman.h>#include <fcntl.h>typedef struct {    int integer;    char string[24];} RECORD;#define NRECORDS (100)int main(){    RECORD record, *mapped;    int i, f;    FILE *fp;    fp = fopen("records.dat","w+");    for(i=0; i<NRECORDS; i++) {        record.integer = i;        sprintf(record.string,"RECORD-%d",i);        fwrite(&record,sizeof(record),1,fp);    }    fclose(fp);/*  We now change the integer value of record 43 to 143    and write this to the 43rd record's string.  */    fp = fopen("records.dat","r+");    fseek(fp,43*sizeof(record),SEEK_SET);    fread(&record,sizeof(record),1,fp);    record.integer = 143;    sprintf(record.string,"RECORD-%d",record.integer);    fseek(fp,43*sizeof(record),SEEK_SET);    fwrite(&record,sizeof(record),1,fp);    fclose(fp);/*  We now map the records into memory    and access the 43rd record in order to change the integer to 243    (and update the record string), again using memory mapping.  */    f = open("records.dat",O_RDWR);    mapped = (RECORD *)mmap(0, NRECORDS*sizeof(record),                           PROT_READ|PROT_WRITE, MAP_SHARED, f, 0);    mapped[43].integer = 243;    sprintf(mapped[43].string,"RECORD-%d",mapped[43].integer);    msync((void *)mapped, NRECORDS*sizeof(record), MS_ASYNC);    munmap((void *)mapped, NRECORDS*sizeof(record));    close(f);    exit(0);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?