linux 공유 메모리 예제

By Dave Sanasack, on Aug, 02 2019

명령 인수에 따라 fork()로 새 프로세스가 시작되고 file_name 변수만 읽는 동안 공유 메모리에 저장된 current_path 변수를 읽고 수정해야 합니다. shmat(): 공유 메모리 세그먼트를 사용하려면 shmat()를 사용하여 자신을 연결해야 합니다. 보이드 *shmat (int shmid, 보이드 * shmaddr, int shmflg); shmid는 공유 메모리 ID입니다. shmaddr는 사용할 특정 주소를 지정하지만 0으로 설정해야하며 OS는 자동으로 주소를 선택합니다. 표준 I/O 라이브러리에는 파일의 배타적 잠금과 공유 잠금을 검사하고 조작하는 데 사용할 수 있는 fcntl이라는 유틸리티 함수가 포함되어 있습니다. 이 함수는 프로세스 내에서 파일을 식별하는 음수가 아닌 정수 값인 파일 설명자(file 설명자)를 통해 작동합니다. (다른 프로세스의 파일 설명자가 동일한 물리적 파일을 식별할 수 있습니다.) 파일 잠금을 위해 Linux는 fcntl 주위의 얇은 래퍼인 라이브러리 함수 무리를 제공합니다. 첫 번째 예제에서는 fcntl 함수를 사용하여 API 세부 정보를 노출합니다. 프로세스는 실행 중인 프로그램이며 각 프로세스에는 프로세스가 액세스할 수 있는 메모리 위치로 구성된 자체 주소 공간이 있습니다. 프로세스에는 실행 가능한 명령 시퀀스인 하나 이상의 실행 스레드가 있습니다. 프로세스 내의 스레드는 다양한 리소스, 특히 주소 공간을 공유합니다. 따라서 프로세스 내의 스레드는 공유 메모리를 통해 직접 통신할 수 있지만 일부 최신 언어(예: Go)는 스레드 안전 채널 사용과 같은 보다 체계적인 접근 방식을 권장합니다.

여기서 관심있는 것은 기본적으로 다른 프로세스가 메모리를 공유하지 않는다는 것입니다. 나는 fork ()와 공유 메모리를 사용하는 잘 문서화 된 예를 찾으려고 노력했지만 성공하지 못했습니다. mmap에 대한 첫 번째 인수는 NULL이며, 이는 시스템이 가상 주소 공간에서 메모리를 할당할 위치를 결정한다는 것을 의미합니다. 대신 주소를 지정하는 것은 가능하지만 까다롭습니다. MAP_SHARED 플래그는 할당된 메모리가 프로세스 간에 공유 가능하며 마지막 인수(이 경우 0)는 공유 메모리의 오프셋이 첫 번째 바이트여야 한다는 것을 의미합니다. 크기 인수는 할당할 바이트 수(이 경우 512)를 지정하고 보호 인수는 공유 메모리를 기록하고 읽을 수 있음을 나타냅니다. 다음은 memwriter 및 memreader 프로그램이 공유 메모리를 통해 통신하는 방법에 대한 개요입니다: Linux 시스템은 공유 메모리에 대해 두 개의 별도의 API를 제공합니다: 레거시 시스템 V API와 최신 POSIX API. 그러나 이러한 API는 단일 응용 프로그램에서 혼합해서는 안 됩니다.