Java教程

mmap应用--进程间通信

本文主要是介绍mmap应用--进程间通信,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、两个程序映射同一个文件到自己的地址空间, 进程A先运行, 每隔两秒读取映射区域, 看是否发生变化. 进程B后运行, 它修改映射区域, 然后推出, 此时进程A能够观察到存储映射区的变化。

#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("hello.txt", 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_SHARED, fd, 0)) == (void *)-1) 
 {   
    perror("mmap");  
 }   
 
 /* 文件已在内存, 关闭文件也可以操纵内存 */ 
    close(fd);  
 
 /* 每隔两秒查看存储映射区是否被修改 */ 
 while (1) {   
        printf("%s\n", mapped);  
        sleep(2);  
    }   
 
 return 0;  
}  
~                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
~                       
```  //进程B
#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("hello.txt", 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_SHARED, fd, 0)) == (void *)-1) {   
        perror("mmap");  
    }   
 
 /* 映射完后, 关闭文件也可以操纵内存 */ 
    close(fd);  
 
 /* 修改一个字符 */ 
    mapped[20] = '6';
    mapped[19] = '6';

    if ((msync((void *)mapped, sb.st_size, MS_SYNC)) == -1) {   
        perror("msync");  
    }   
 
     /* 释放存储映射区 */ 
    if ((munmap((void *)mapped, sb.st_size)) == -1) {   
        perror("munmap");  
    }   


 return 0;  
}
这篇关于mmap应用--进程间通信的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!