linux下c通过虚拟地址映射读写文件

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<string.h>
#include<sys/mman.h>
struct stu
{
	char name[20];
	int age;
	float score;
};
//1 打开文件,2 映射到虚拟地址,3 写入数据,4 卸载虚拟地址,5关闭文件
main()
{
	int fd;
	struct stu *s;
	struct stat st;
	int size;
	int count;
	struct stu record;
	memset(&record,0,sizeof(struct stu));
	fd=open("newstu.dat",O_RDWR|O_CREAT|O_EXCL,0666);
	if(fd==-1)
	{
		fd=open("newstu.dat",O_RDWR);
		if(fd==-1) printf("::%m\n"),exit(-1);
	}
	fstat(fd,&st);
	size=st.st_size;//原大小
	count=size/sizeof(struct stu);
	ftruncate(fd,size+sizeof(struct stu));;//改变文件大小,在munmap前调用就行,+ 就是增大,-就是减小
	s=mmap(0,size+sizeof(struct stu),
			PROT_READ|PROT_WRITE,
			MAP_SHARED,fd,0);
	//*
	printf("输入姓名:");
	scanf("%s",s[count].name);
	printf("输入年龄:");
	scanf("%s",&(s[count].age));
	printf("输入分数:");
	scanf("%f",&(s[count].score));
	//*/
	int i;
	for(i=0;i<count-1;i++)
	{
		printf("%s,%d,%.2f\n",s[i].name,s[i].age,s[i].score);
	}
	munmap(s,size+sizeof(struct stu));
	close(fd);
}

//makefile文件

map_write:map_write.c
    gcc map_write.c -o main
   

[pkm@linux ~/files]make map_write
gcc map_write.c -o main

时间: 2024-10-23 18:21:43

linux下c通过虚拟地址映射读写文件的相关文章

linux下怎么写一个自动创建文件夹和文件的脚本?

问题描述 linux下怎么写一个自动创建文件夹和文件的脚本? linux下怎么写一个自动创建文件夹和文件的脚本?就是说我给一个绝对路径,程序会自动帮我创建在路径中没有的文件夹和文件. 解决方案 http://blog.csdn.net/hellochenlian/article/details/37566269 -p, --parents 可以是一个路径名称.此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录; 解决方案二: mkdir 加上

初学者-linux下安装rpm包,挂载文件问题

问题描述 linux下安装rpm包,挂载文件问题 1C 求解这是为什么啊...初学者请谅解~ 解决方案 有dependency依赖问题,缺少libcryptolibssl,这个是openssl的库文件,所以你需要现在机器上安装上openssl 解决方案二: 他们两个有什么关系呀? 解决方案三: yum -y install gcc gcc-c++ autoconf automake makeyum -y install zlib zlib-devel openssl openssl--devel

linux下没有后缀名的安装文件是什么?

问题描述 linux下没有后缀名的安装文件是什么? 在官网上下了.gz文件,解压后是这样的,这怎么安装? 解决方案 linux文件没有具体区别,不像微软的那样,只要有权限就可以执行,具体怎样安装需要看,制作者 解决方案二: gz格式一般是源码包,这个你在命令行下面看下文件全名,有可能是文件窗口中隐藏后缀了 解决方案三: 1使用命令安装,apt install,百度搜一下会有的 2使用应用中心安装 解决方案四: 你看一下,你下载的是不是源码包.如果是源码包,安装的话,需要进行编译的.

关于linux下的cp命令 如何把文件拷贝到任意文件夹下

问题描述 关于linux下的cp命令 如何把文件拷贝到任意文件夹下 比如将etc下的hosts文件拷贝:cp /etc/hosts ~ 该文件就会被拷贝至用户文件夹下 可是如果想在etc下再拷贝一份 应该怎么操作 这样的命令:cp /etc/hosts ~/etc/host.new 会被显示无效 是不是只能把文件拷贝到/Users/下的用户文件夹里 解决方案 应该是不可以的,man cp可以看到: Copy SOURCE to DEST, or multiple SOURCE(s) to DIR

浅谈Linux下通过find命令进行rm文件删除的小技巧_Linux

我们经常会通过find命令进行批量操作,如:批量删除旧文件.批量修改.基于时间的文件统计.基于文件大小的文件统计等,在这些操作当中,由于rm删除操作会导致目录结构变化,如果要通过find结合rm的操作写成脚本,就会遇到一些麻烦,本文通过一个例子为大家进行介绍. 系统环境: SUSE Linux Enterprise Server 11 或 Red Hat Enterprise Linux 问题症状: 客户现场有一个自动化的脚本,有以下的find语句,每天运行以删除某个目录下7天以前的文件或目录,

linux下TUN/TAP虚拟网卡的使用

转载:http://wushank.blog.51cto.com/3489095/1306849 tun/tap 驱动程序实现了虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装.利用tun/tap 驱动,可以将tcp/ip协议栈处理好的网络分包传给任何一个使用tun/tap驱动的进程,由进程重新处理后再发到物理链路中.开源项目openvpn (http://openvpn.sourceforge.net)和Vtun(http://vt

Linux下如何恢复意外删除的文件

今天有客户的数据库意外被删除了整个目录中的数据文件,操作系统级别的删除,然而幸运的是这个数据库没有崩溃,仍然处于open状态的时候,客户就发现了问题,求助到我们,最终完整地恢复了所有数据文件. 在Linux下大致重新演示一下恢复的过程,恢复的步骤与数据库版本没有太大关系,与操作系统的不同会有所不同. 1. 在数据库open的时候,直接删除users表空间中的数据文件. SQL> select name from v$datafile; NAME -------------------------

linux下perl,sed,shell批量替换文件内容

  方法1: 这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库. 手 工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下: find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'下面这个例子就是将当前目录

linux下使用scp服务器之间复制文件和目录命令

scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器硬盘变为只读 read only system时,用scp可以帮你把文件移出来.另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了.虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用. 1.命