SYS/SHM.H를 통해 여러 변수를 공유합니다
-
19-09-2019 - |
문제
SHM.H 라이브러리를 사용하여 하나의 공유 메모리 블록을 사용하여 두 가지 다른 두 가지를 공유하려고합니다. 하나의 공유 메모리 블록이 생성되고 두 정수를 잡을만큼 큰 예를 썼습니다. 그런 다음 두 개의 정수를 첨부하고 두 개의 프로세스를 만듭니다. 첫 번째 프로세스는 첫 번째 정수를 증가시킵니다. 그런 다음 두 번째 프로세스는 두 정수의 값을 인쇄합니다. 그러나 일어나는 일은 두 정수가 모두 증가한다는 것입니다.
내가 뭘 잘못하고 있죠? 방금 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에서 실행하고 있습니다.
해결책
두 정수가 증가하지 않습니다. 하나의 정수가 증가하고 있지만 동일한 공유 메모리에 매핑되는 두 프로세스 주소에서 인쇄하고 있습니다.
System Memory Manager는 공유 메모리를 해결하기 위해 무대 뒤에서 일부 게임을합니다. 완전히 다른 두 가지 프로세스에서는 각 프로세스에서 공유 메모리를 두 개의 완전히 다른 주소에 매핑 한 것을 발견하는 것은 놀라운 일이 아닙니다. 여기서도 같은 일이 일어나고 있습니다. 주소를 각각 처리하기 위해 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 두 줄 사이에서 변경되지 않습니다. 이것은 당신이 동일한 공유 메모리 세그먼트를 얻고 있음을 의미합니다. 데이터 1 그리고 데이터 2. 다른 것을 만들어야합니다 Shmid ~을 위한 데이터 2 ~하도록 하다 데이터 2 다른 공유 메모리 세그먼트를 가져옵니다.