c_cpp Linux下IPC通信之共享映射区mmap示例
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp Linux下IPC通信之共享映射区mmap示例相关的知识,希望对你有一定的参考价值。
//父子进程间通信
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
//1. 先创建映射区
int fd = open("mem.txt",O_RDWR|O_CREAT|O_TRUNC,0666);
if(fd < 0){
perror("open err");
exit(1);
}
//拓展文件大小
truncate("mem.txt",4);
int *mem = mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
//int *mem = mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_PRIVATE,fd,0);
if(mem == MAP_FAILED){
perror("mmap err");
exit(1);
}
//2. fork子进程
pid_t pid = fork();
//3. 父子进程交替改映射区内容
if(pid == 0){
//子进程
*mem = 100;
sleep(2);
printf("child,mem is %d\n",*mem);
}else if(pid > 0){
//父进程
sleep(1);//父进程先睡觉等待子进程修改内存
printf("parent,mem is %d\n",*mem);
*mem = 200;
}
//4. 关闭映射区
if(munmap(mem,4) < 0 ){
perror("munmap err");
exit(1);
}
//5. 关闭文件描述符
close(fd);
return 0;
}
//无血缘关系进程间通信
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
struct student {
int sid;//学号
char sname[20];//学生名字
};
int main(int argc,char *argv[])
{
if(argc !=2 ){
printf("./a.out filename\n");
return -1;
}
//1. 打开文件 获得fd
int fd = open(argv[1],O_RDWR|O_CREAT|O_TRUNC,0666);
if(fd < 0){
perror("open file err");
exit(1);
}
truncate(argv[1],sizeof(struct student));//拓展文件大小为结构体大小
//2. 建立映射区 SHARED
struct student *ps = mmap(NULL,sizeof(struct student),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(ps == MAP_FAILED){
perror("mmap err");
exit(1);
}
int num = 1000;
//3. 写数据
while(1){
ps->sid = num;//设置学号
sprintf(ps->sname,"xiaoming-%04d",num++);//设置名字
sleep(1);
}
//4. 关闭文件
close(fd);
//5. 释放映射区
if(munmap(ps,sizeof(struct student)) < 0){
perror("munmap err");
return -1;
}
return 0;
}
//无血缘关系进程间通信
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
struct student {
int sid;
char sname[20];
};
int main(int argc ,char *argv[])
{
if(argc != 2){
printf("./a.out filename");
exit(1);
}
//1 打开文件
int fd = open(argv[1],O_RDWR);
if(fd < 0 ){
perror("open err");
exit(1);
}
//2 建立映射区
struct student *ps = mmap(NULL,sizeof(struct student),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(ps == MAP_FAILED){
perror("mmap err");
exit(1);
}
//3 读数据
while(1){
printf("sid:%d,sname:%s\n",ps->sid,ps->sname);
sleep(1);
}
//4. 关闭文件
close(fd);
//5. 释放映射区
if(munmap(ps,sizeof(struct student)) < 0){
perror("munmap err");
return -1;
}
return 0;
}
以上是关于c_cpp Linux下IPC通信之共享映射区mmap示例的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp Linux下IPC通信之有名管道fifo示例
Linux环境编程之共享内存区:共享内存区简单介绍
Linux系统编程 --进程间通信 -共享内存
linux进程间通信之Posix共享内存用法详解及代码举例
c_cpp Linux的下IPC通信之本地套接字
UNIX网络编程:共享内存区