无血源关系进程间通信之mmap

   如我们所知,进程间通信机制有多种:FIFO,PIPE,全局变量,共享内存以及信号等等。 那么非血缘关系的进程间常用的通信方式就是共享内存了。

  对于共享内存在非父子进程间的通信方式如下:

  有两个进程,一个用来对共享内存写数据,一个用来读取共享内存数据。

 写数据的进程程序:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>

struct stu
{
int id;
char name[24];
char sex;
};

int main(int argc,char *argv[])
{
struct stu *mm;
struct stu st={1,"tommy",'w'};
int fd = open("1.txt",O_RDWR);
if(fd < 0)
{
perror("open failed.");
exit(1);
}

ftruncate(fd,sizeof(struct stu));

mm = (struct stu*)mmap(NULL,sizeof(st),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(mm == MAP_FAILED)
{
perror("mmap failed.");
close(fd);
exit(1);
}
close(fd);

while(1)
{
memcpy(mm,&st,sizeof(st));
sleep(1);
st.id++;
}

return 0;
}

 ****************************************************************************************************************

读取数据的程序:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>

struct stu
{
int id;
char name[24];
char sex;
};

int main(int argc,char *argv[])
{
struct stu *mm;
int fd = open("1.txt",O_RDWR);
if(fd < 0)
{
perror("open failed.");
exit(1);
}


mm = (struct stu*)mmap(NULL,sizeof(struct stu),PROT_READ,MAP_SHARED,fd,0);
if(mm == MAP_FAILED)
{
perror("mmap failed.");
close(fd);
exit(1);
}
close(fd);

while(1)
{
printf("mm->id = %d;mm->name=%s;mm->sex=%c\n",mm->id,mm->name,mm->sex);
sleep(1);
}

return 0;
}

根据以上可以看出来,读取和写入数据的程序差别不大,无非就是映射或打开的权限不同,操作不同。

上一篇:java8学习之收集器用法详解与多级分组和分区


下一篇:js 原型链与继承