原地址:http://blog.csdn.net/a8887396/article/details/9009485
1 fstat 获取文件状态
int fstat(int fd, struct stat *buf);struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
2 ftruncate改变文件大小
int ftruncate(int fd, off_t length);如果length比原来的大,则在文件后面添加'\0'
如果length比原来的小,则在截断文件
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <stdio.h>
- int main()
- {
- int fd;
- struct stat st;
- fd = open("stu.dat",O_RDWR);
- fstat(fd,&st); //错误:存储大小未知 没加头文件
- printf("%d,%o\n",(int)st.st_size,st.st_mode); //72 100644
- ftruncate(fd,st.st_size+1000); // 需要写权限才能改变大小
- fstat(fd,&st);
- printf("%d\n",(int)st.st_size);
- close(fd);
- }
zhao@ubuntu:~/unix/4$ ./fstat
72,100644
1072
3 文件映射
mmap /munmap
之前介绍过(http://blog.csdn.net/a8887396/article/details/8996213) ,写的是内存映射,拷过来
void *mmap(
void *start, //指定映射的虚拟地址 如为0 系统指定开始位置
size_t length, //映射的空间大小 : pagesize倍数
int prot,//映射权限 PROT_NONE PROT_READ PROT_WRITE PROT_EXEC
int flags,//映射方式
int fd,//文件描述符
offset_t off); //文件中的偏移位置(必须是page_size的倍数)
int munmap(void *addr, size_t length);
映射方式:
内存映射:匿名映射
文件映射:映射到文件 ,只有当文件映射时,最后两个参数才有效
MAP_ANONYMOUS 写了就是内存映射 不写就是文件映射
MAP_PRIVATE MAP_SHARED 2选1
umap(void *start,size_t lenth)
1使用内存方式写入数据
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/mman.h>
- struct stu
- {
- char name[20];
- int age;
- float score;
- };
- int main()
- {
- //打开文件
- //增加文件大小
- //映射到虚拟地址
- //把数据写入虚拟地址
- //卸载虚拟地址
- //关闭文件
- int fd = open("newstu.dat",O_RDWR|O_CREAT,0666);
- if(fd < 0)
- {
- perror("open error");
- return 1;
- }
- struct stat st;
- fstat(fd,&st);
- int size = st.st_size ; //文件大小
- int count = size/sizeof(struct stu);//记录条数
- //因为要增加数据 所以要先增加文件大小(很重要)
- ftruncate(fd,size+sizeof(struct stu)); //增加文件大小
- //将文件映射到内存的虚拟地址,得到文件在虚拟内存中映射的首地址
- struct stu*s= mmap(0,
- size+sizeof(struct stu),
- PROT_WRITE|PROT_READ,
- MAP_SHARED,
- fd,0);
- printf("请输入学生姓名");
- scanf("%s",s[count].name);
- printf("请输入学生年龄");
- scanf("%d",&s[count].age);
- printf("请输入学生成绩");
- scanf("%f",&s[count].score);
- munmap(s,size+sizeof(struct stu));
- close(fd);
- }
2使用内存方式读取数据
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/mman.h>
- struct stu
- {
- char name[20];
- int age;
- float score;
- };
- int main()
- {
- int fd = open("newstu.dat",O_RDWR);
- if(fd < 0)
- {
- perror("open fail");
- return 1;
- }
- struct stat st;
- fstat(fd,&st);
- int size = st.st_size;
- int count = size/sizeof(struct stu);
- struct stu*s = mmap(0,size,PROT_READ | PROT_WRITE,
- MAP_SHARED,fd,0);
- if(s < 0)
- {
- perror("mmap error");
- return 1;
- }
- int i =0;
- for(; i<count ;i++)
- {
- printf("name:%s,age:%d,score:%.2f\n",s[i].name,s[i].age,s[i].score);
- }
- munmap(s,size);
- close(fd);
- }