我使用共享内存进行两个不同进程之间的通信。我正在创建16 MB大小的共享内存。我试图附加共享内存的两个不同部分。一个用于写作,另一个用于阅读。即使它映射到不同的内存地址,但是当一个被修改时,其他也会被更改。我一定做错了什么。下面是我附加到多个共享内存位置的代码片段。
void createCommPool ()
{
CommSet set1;
int shmid1;
int fd1;
int r;
void * ptr;
void * ptr_res;
umask (0);
fd1 = open(SHARED_MEMORY0, O_CREAT | O_TRUNC | O_RDWR, 0777);
if (fd1 == -1)
error_and_die("open");
r = ftruncate(fd1, region_size);
if (r != 0)
error_and_die("ftruncate");
ptr = mmap(0, sizeof(struct operation_st), PROT_READ | PROT_WRITE,
,MAP_SHARED,fd1,sizeof(struct operation_st));
if (ptr == MAP_FAILED)
error_and_die("mmap");
close(fd1);
set1.shm_addr = ptr;
fd1 = open(SHARED_MEMORY0, O_RDWR, 0777);
if (fd1 == -1)
error_and_die("open");
fprintf(stderr,"The value of the file descriptor:%d\n",fd1);
if (lseek(fd1,sizeof(struct operation_st),SEEK_SET)<0)
{
fprintf(stderr,"could not perform lseek\n");
perror("lseek");
}
ptr_res = mmap(0,sizeof(struct operation_st), PROT_READ| PROT_WRITE,
MAP_SHARED,fd1,0);
if (ptr_res == MAP_FAILED)
error_and_die("mmap2");
close(fd1);
set1.shm_addr_res = ptr_res;
}
答案 0 :(得分:0)
对于共享内存中的数据,请避免使用pack
:
#pragma pack(1)
your shared memory code
#pragma unpack
答案 1 :(得分:0)
lseek对共享内存的映射没有任何影响。应使用offset参数以映射到共享内存的不同部分。偏移量应为页面大小的倍数。