今天继续看《Linux程序设计第四版》,发现了一个很好玩的东西。数据如果读入内存了,怎么去修改...另外各类基本的C语言函数用法也过了一遍。
#include<unistd.h>
#include<stdio.h>
#include<sys/mman.h>
#include<fcntl.h>
#include<stdlib.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);
//下面被注释掉的这段是我们平时最常用的,更改某个文本文件内容的方式。一般都是定义个指针然后干活。
/*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); */
//让我开眼的内存修改法
f = open("records.dat",O_RDWR); //打开文件,这个函数在fcntl.h里面
mapped = (RECORD *)mmap(0,NRECORDS*sizeof(record),PROT_READ|PROT_WRITE,MAP_SHARED,f,0);/*records.dat被映射到了本机的某个地址空间里面,
可读可写被共享,f是文件描述符号(文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。
第一个打开的文件是0,第二个是1,依此类推。Unix 操作系统通常给每个进程能打开的文件数量强加一个限制。更甚的是,unix 通常有一个系统级的限制。),
简单说,我理解文件描述符为系统需要执行对应命令的跟踪符号,最后的0指的是内存起始点*/
mapped[43].integer = 243; //居然自己一个个变成了数组!!这里的第四十三号位内存单元住的record被改啦
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);
}
亮点自寻...