Linux 通过sys/shm.h共享多个变量
我试图使用shm.h库中的一个共享内存块来共享两个不同的内存块。我编写了以下示例,其中创建了一个共享内存块,它足够大,可以容纳两个整数。然后,我将两个整数附加到它并创建两个进程。第一个进程递增第一个整数。然后,第二个进程打印出两个整数的值。但实际情况是两个整数都会递增 我做错了什么?我刚开始学习如何使用shm库 代码如下:Linux 通过sys/shm.h共享多个变量,linux,gcc,shared-memory,Linux,Gcc,Shared Memory,我试图使用shm.h库中的一个共享内存块来共享两个不同的内存块。我编写了以下示例,其中创建了一个共享内存块,它足够大,可以容纳两个整数。然后,我将两个整数附加到它并创建两个进程。第一个进程递增第一个整数。然后,第二个进程打印出两个整数的值。但实际情况是两个整数都会递增 我做错了什么?我刚开始学习如何使用shm库 代码如下: #include <sys/sem.h> #include <sys/ipc.h> #include <sys/types.h> #inc
#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");
}
}
我在Gentoo Linux上运行它。我注意到以下两行:
if((data1=shmat(shmID,NULL,0))==(int *)-1)
及
其中,shmID不会在两行之间进行更改。这意味着您将获得与data1和data2相同的共享内存段。您需要为data2创建另一个shmId,以便data2获得不同的共享内存段。两个整数不会递增。一个整数正在递增,但您正在从映射到同一共享内存的两个进程地址打印它 系统内存管理器在后台玩一些游戏来解析共享内存。在两个完全不同的进程中,发现它将共享内存映射到每个进程中的两个完全不同的地址并不奇怪。同样的事情也在这里发生。它将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((data2=shmat(shmID,NULL,0))==(int *)-1)
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));