linuxmm-apLinux下实现文件内存映射-MMAP (linux命令)

教程大全 2025-07-08 19:23:44 浏览

Linux操作系统提供了文件内存映射(memory-mapped file)函数,简称MMAP,以“映射”文件和内存之间的关系,实现文件与内存之间的数据交互。MMAP是一种技术,它允许程序在使用这个功能时,可以把整个文件映射到进程的地址空间中,然后就可以在进程中直接使用文件数据,不再需要读写操作。使用映射后,程序将文件数据当作内存来操作,也就是把文件数据当作进程的一个内存结构去使用,这样使得程序的开发变得更加容易。

Linux下实现文件内存映射的函数有mmap()、munmap()、msync()三个函数,分别用于文件内存映射、取消内存映射、同步文件数据。

mmap()函数接受几个参数,第一个参数是指定目标文件;第二个参数是指定映射到进程的空间的大小;第三个参数是指定对文件的访问权限,可以是读、写或可读可写;第四个参数是指定映射文件时的偏移量,可以从文件某个字节处开始;第五个参数是指定映射文件后,指定目标文件的复制。mmap()函数如果返回成功,返回文件地址指针,然后我们就可以用这个指针访问文件中的值;如果返回失败,则返回-1.

munmap()函数可以取消mmap()函数实现的内存映射,它接受一个参数,这个参数就是mmap()函数返回的文件地址指针,如果成功,返回0;如果失败,返回-1.

msync()函数可以同步文件数据,它接受三个参数,第一个参数是指定将要同步的文件地址指针;第二个参数指定同步文件的大小;第三个参数同步文件需要的操作,可以是MS_SYNC、MS_ASYNC和MS_INVALIDATE。如果同步成功,msync()函数返回0;否则,返回-1.

使用MMAP可以很方便地实现文件和内存之间的数据交换,方法也不是很复杂,只需要用到三个函数mmap()、munmap()、msync(),并设置相关参数即可完成文件内存映射。

香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。


select和epoll的区别

下面是select的函数接口: int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); select 函数监视的文件描述符分3类,分别是writefds、readfds、和exceptfds。调用后select函数会阻塞,直到有

linux c怎么实现从文件的最后一行一行向前读文件

下面的例子使用mmap读最后20行(假设最后20行不会超过1024字节)/*-* Copyright (C), 1988-2014, mymtom** vi:set ts=4 sw=4:*/#ifndef lintstatic const char rcsid[] = $Id$;#endif /* not lint *//*** @filelast20.c* @brief*/#include #include #include #include #include #include #include char *memchrr(const void *v1, const char *v2, int c){char *s1, *s2;char *p;s1 = (char *)v1;s2 = (char *)v2;for (p = s2; p >= s1; --p) {if (*p == c)return p;}return NULL;}#define READSIZE1024int main(int argc, char *argv[]){int ret;FILE *fp;char *addr;size_t len;int prot;int flags;int fd;off_t off;off_t rem;long Pagesize;struct stat buf;pagesize = sysconf(_SC_PAGESIZE);fp = fOpen(last20.c, rb);fd = fileno(fp);ret = fstat(fd, &buf);if (_size <= READSIZE || _size <= pagesize) {off = 0;len = _size;} else {off = _size - READSIZE;rem = off % pagesize;off = off - rem;len = READSIZE + rem;}/*printf(size=%d READSIZE=%d off=%d len=%d\n,(int)_size,(int)READSIZE,(int)off,(int)len);*/prot = PROT_READ;flags = MAP_PRIVATE;addr = mmap(NULL, len, prot, flags, fd, off);fclose(fp);{int i, n;char *head, *tail;size_t size;char line[1024];tail = addr + len - 1;n = 20;for (i = 0; i < n; ++i) {head = memchrr(addr, tail - 1, \n);if (head == NULL) {size = tail - addr;memcpy(line, addr, size);line[size] = \0;} else {size = tail - head - 1;memcpy(line, head + 1, size);line[size] = \0;tail = head;}printf(%s\n, line);if (head == NULL) {break;}}}munmap(addr, len);return 0;}运行结果为:./last20 | tac | cat -nline[size] = \0;} else {size = tail - head - 1;memcpy(line, head + 1, size);line[size] = \0;tail = head;}printf(%s\n, line);if (head == NULL) {break;}}}munmap(addr, len);return 0;}

linux 下 如何去掉文件中每行末尾的N个字符(每行的n个字符不相同)

MMAP

open文件,把文件内容映射到内存,用指针指到每行末尾(检测\n),然后再把指针前移N,依次填充\0最后加上\n.跳转到下行。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐