通过sys / shm.h共享多个variables

我试图使用shm.h库共享两个不同的使用共享内存块。 我写了下面的例子,其中一个共享内存块被创build并且足够大以容纳两个整数。 然后我附加两个整数,并创build两个进程。 第一个进程增加第一个整数。 第二个过程然后打印出两个整数的值。 但是会发生什么呢是两个整数都增加了。

我究竟做错了什么? 我刚开始学习如何使用shm库。

这是代码:

#include <sys/sem.h> #include <sys/ipc.h> #include <sys/types.h> #include <sys/shm.h> #include <stdio.h> #include <unistd.h> int main() { // Declare variables int shmID; int *data1; int *data2; // Create a shared memory segment if((shmID=shmget(IPC_PRIVATE, 2*sizeof(int), 0666 | IPC_CREAT))<0) { fprintf(stderr,"Problem initializing shared memory\n"); perror("main"); return -1; } if((data1=shmat(shmID,NULL,0))==(int *)-1) { fprintf(stderr,"Problem attaching memory 1\n"); perror("main"); return -1; } if((data2=shmat(shmID,NULL,0))==(int *)-1) { fprintf(stderr,"Problem attaching memory 2\n"); perror("main"); return -1; } printf("%p %p\n",data1,data2); (*data1)=0; (*data2)=0; if(fork()) { // Process 1 will be the incrementer for(int i=0;i<100;i++) { (*data1)++; printf("IN: %d\n",(*data1)); sleep(1); } printf("IN DONE\n"); } else { while((*data1)<50) { printf("OUT: %d %d\n",(*data1),(*data2)); sleep(1); } printf("OUT DONE\n"); } } 

这是输出:

 0x7fcd42a97000 0x7fcd42a96000 IN: 1 OUT: 1 1 IN: 2 OUT: 2 2 IN: 3 OUT: 3 3 

我在Gentoo Linux上运行这个。

两个整数不会递增。 一个整数正在递增,但是您将从映射到相同共享内存的两个进程地址中打印出来。

系统内存管理器在幕后玩一些游戏来解析共享内存。 在两个完全不同的进程中,发现它在每个进程中将共享内存映射到两个完全不同的地址并不奇怪。 同样的事情发生在这里。 它映射data1和data2分别处理地址0x7fcd42a97000和0x7fcd42a96000,但他们实际上指向共享内存中的相同的东西。

如果我明白你想要测试什么,添加和更改行:

  printf("%p %p\n", data1, data2); (*data1) = 0; (*data2) = 0; int *data3 = data2 + 1; //points 1 int beyond data1 & data2 (*data3) = 5; //will always print 5 //............ printf("OUT: %d %d %d\n", (*data1), (*data2), (*data3)); 

我注意到以下两行:

 if((data1=shmat(shmID,NULL,0))==(int *)-1) 

 if((data2=shmat(shmID,NULL,0))==(int *)-1) 

shmID在两行之间没有改变。 这意味着你正在为data1data2获得相同的共享内存段。 您需要为data2创建另一个shmId ,以便data2获得不同的共享内存段。