UNIX环境高级编程:存储映射I/O(mmap函数)
发布时间:2016-09-27 12:24:40 所属栏目:Unix 来源:站长网
导读:副标题#e# 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共
注释掉44-46与没有注释,运行结果都为: huangcheng@ubuntu:~$ cat data.txt aaaaaaaaaaaa bbbbbbbbbbbb cccccccccccc dddddddddddd eeeeeeeeeeee ffffffffffff huangcheng@ubuntu:~$ ./a.out data.txt aaaaaaaaaaaa bbbbbbbbbbbb cccccccccccc dddddddddddd eeeeeeeeeeee ffffffffffff huangcheng@ubuntu:~$ cat data.txt aaaaaaaaaaaa bbbbbbb9bbbb cccccccccccc dddddddddddd eeeeeeeeeeee ffffffffffff 2 私有映射无法修改文件 #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <error.h> #define BUF_SIZE 100 int main(int argc, char **argv) { int fd, nread, i; struct stat sb; char *mapped, buf[BUF_SIZE]; for (i = 0; i < BUF_SIZE; i++) { buf[i] = '#'; } /* 打开文件 */ if ((fd = open(argv[1], O_RDWR)) < 0) { perror("open"); } /* 获取文件的属性 */ if ((fstat(fd, &sb)) == -1) { perror("fstat"); } /* 将文件映射至进程的地址空间,这里是私有映射 */ if ((mapped = (char *)mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0)) == (void *)-1) { perror("mmap"); } /* 映射完后, 关闭文件也可以操纵内存 */ close(fd); printf("%s", mapped); /* 修改一个字符,同步到磁盘文件 */ mapped[20] = '9'; if ((msync((void *)mapped, sb.st_size, MS_SYNC)) == -1) { perror("msync"); } /* 释放存储映射区 */ if ((munmap((void *)mapped, sb.st_size)) == -1) { perror("munmap"); } return 0; } 运行结果: huangcheng@ubuntu:~$ cat data.txt aaaaaaaaaaaa bbbbbbbbbbbb cccccccccccc dddddddddddd eeeeeeeeeeee ffffffffffff huangcheng@ubuntu:~$ ./a.out data.txt aaaaaaaaaaaa bbbbbbbbbbbb cccccccccccc dddddddddddd eeeeeeeeeeee ffffffffffff huangcheng@ubuntu:~$ cat data.txt aaaaaaaaaaaa bbbbbbbbbbbb cccccccccccc dddddddddddd eeeeeeeeeeee ffffffffffff (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |