zoukankan      html  css  js  c++  java
  • linux系统编程:进程间通信-mmap

                                 进程间通信-mmap

    #include <sys/mman.h>
    void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
    int munmap(void *addr, size_t length);
      

    mmap本质是把内存与硬盘上的文件同步。某块内存中的内容会同步到硬盘文件上,即把文件映射到内存。故通过对同一文件的读写达到进程间的通信。

    參数解释:

    addr:指定对哪儿块内存实行映射。

    NULL表示由系统分配。

    length:addr的长度

    prot:内存块儿的属性:读、写、运行。

    flag:内存块儿的内容是否同步到文件里。MAP_SHARED同步,MAP_PRIVATE不同步。

    fd:文件描写叙述符

    offset:文件映射的起始位置

    成功。返回映射的内存地址;失败返回void *(-1)。

    mmap.c

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <sys/mman.h>
    
    void sys_err(char *s)
    {
    	perror(s);
    	exit(1);
    }
    int main(int argc, char **argv)
    {
    	if(argc < 2)
    	{
    		fprintf(stdin, "usage:./a.out filename");
    		return 1;
    	}
    
    	int fd;
    	fd = open(argv[1], O_RDWR);
    	if(fd < 0) sys_err("open");
    	off_t len;
    	len = lseek(fd, 0, SEEK_END);
    
    	void *mem;
    	mem = mmap(NULL, len, PROT_WRITE, MAP_SHARED, fd, 0);
    	if(mem == MAP_FAILED)  //#define MAP_FAILED ((void *) -1)
    		sys_err("mmap");
    	/*
    	if((void*)-1 == mem)
    		sys_err("mmap");
    	*/
    
    	close(fd);
    	
    	printf("%s
    ", mem);
    	*(char*)mem = 'Z';
    	*(char*)(mem + 1) = 'X';
    	
    	if(-1 == munmap(mem, len))
    		sys_err("munmap");
    
    	return 0;
    }


    文件file:zhangxiang

    $ gcc mmap.c
    $ ./a.out file
    $ cat file
    ZXangxiang
       
    有了以上的基础,使用mmap进行进程间的通信就简单了。

        


    CCPP Blog 文件夹


  • 相关阅读:
    git取消文件跟踪
    servlet
    查杀端口进程
    初始化git仓库,并push到远端
    tomcat
    bootstrap
    idea中web工程错误
    i++和++i
    js算法
    编程工具
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5320768.html
Copyright © 2011-2022 走看看