UNIX环境高级编程:存储映射I/O(mmap函数)
发布时间:2016-10-12 20:17:52 所属栏目:Unix 来源:网络整理
导读:共享内存可以说是最有用的进程间通信方式,也是最快的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 (编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
