Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

공유 메모리를 통한 IPC

<시간/>

공유 메모리는 둘 이상의 프로세스 간에 공유되는 메모리입니다. 그러나 왜 우리는 기억이나 다른 의사소통 수단을 공유해야 합니까?

다시 말해서, 각 프로세스에는 고유한 주소 공간이 있습니다. 어떤 프로세스가 자체 주소 공간에서 다른 프로세스로 일부 정보와 통신하려는 경우 IPC(프로세스 간 통신) 기술로만 가능합니다. 우리가 이미 알고 있는 것처럼, 통신은 관련되거나 관련되지 않은 프로세스 사이에 있을 수 있습니다.

일반적으로 상호 관련된 프로세스 통신은 Pipes 또는 Named Pipes를 사용하여 수행됩니다. 관련되지 않은 프로세스(예:한 터미널에서 실행 중인 프로세스와 다른 터미널에서 다른 프로세스) 통신은 Named Pipes를 사용하거나 Shared Memory 및 Message Queues의 널리 사용되는 IPC 기술을 통해 수행할 수 있습니다.

우리는 파이프 및 명명된 파이프의 IPC 기술을 보았고 이제 나머지 IPC 기술, 즉 공유 메모리, 메시지 큐, 세마포어, 신호 및 메모리 매핑을 알아야 합니다.

공유 메모리를 통한 IPC

둘 이상의 프로세스 간에 통신하기 위해 공유 메모리를 사용한다는 것을 알고 있지만 공유 메모리를 사용하기 전에 시스템 호출로 수행해야 하는 작업을 살펴보겠습니다. -

  • 공유 메모리 세그먼트를 생성하거나 이미 생성된 공유 메모리 세그먼트(shmget()) 사용

  • 이미 생성된 공유 메모리 세그먼트(shmat())에 프로세스를 연결합니다.

  • 이미 연결된 공유 메모리 세그먼트(shmdt())에서 프로세스 분리

  • 공유 메모리 세그먼트에 대한 제어 작업(shmctl())

여기서 우리는 두 개의 프로세스를 생성할 것입니다. 하나는 쓸 수 있고 다른 하나는 읽을 수 있습니다. 리더와 라이터 프로세스가 공유 메모리를 사용하여 어떻게 작동하는지 봅시다.

예시 코드

#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
using namespace std;
main() {
   key_t my_key = ftok("shmfile",65); // ftok function is used to generate unique key
   int shmid = shmget(my_key,1024,0666|IPC_CREAT); // shmget returns an ide in shmid
   char *str = (char*) shmat(shmid,(void*)0,0); // shmat to join to shared memory
   cout<<"Write Data : ";
   fgets(str, 50, stdin);
   printf("Data written in memory: %s\n",str);
   //detach from shared memory
   shmdt(str);
}

예시 코드

#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
using namespace std;
main() {
   key_t my_key = ftok("shmfile",65); // ftok function is used to generate unique key
   int shmid = shmget(my_key,1024,0666|IPC_CREAT); // shmget returns an ide in shmid
   char *str = (char*) shmat(shmid,(void*)0,0); // shmat to join to shared memory
   printf("Data read from memory: %s\n",str);
   shmdt(str);
   shmctl(shmid,IPC_RMID,NULL); // destroy the shared memory
}

출력

공유 메모리를 통한 IPC