如我们所知,进程间通信机制有多种: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;
}
根据以上可以看出来,读取和写入数据的程序差别不大,无非就是映射或打开的权限不同,操作不同。