我正在使用共享內存進行兩個不同進程之間的通信。我正在創建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;
}
我已經正確對齊了結構,因此沒有字節的影響。我的代碼有什麼問題,它連接到共享內存的同一部分,而不是連接到不同的部分。 – Kunal
@Kunal似乎lseek不會以fd作爲參數影響mmap調用。待驗證。 – lulyon
我試圖將sizeof(struct operation_st)指定爲mmap offset參數,但它給出了MAP_FAILED錯誤。 – Kunal