문제

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 다른 공유 메모리 세그먼트를 가져옵니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top