이것은 리눅스에서 프로세스 간 통신 (IPC)에 대 한 시리즈의 첫 번째 문서입니다. 이 시리즈는 C의 코드 예제를 사용하여 다음과 같은 IPC 메커니즘을 명확히 합니다: Linux 시스템은 공유 메모리에 대해 레거시 시스템 V API와 최신 POSIX API의 두 개의 별도 API를 제공합니다. 그러나 이러한 API는 단일 응용 프로그램에서 혼합해서는 안 됩니다. POSIX 접근 방식의 단점은 기능이 아직 개발 중이며 코드 이식성에 영향을 주는 설치된 커널 버전에 따라 달라지는 것입니다. 예를 들어 POSIX API는 기본적으로 공유 메모리를 메모리 매핑 된 파일로 구현합니다. POSIX에서 공유 메모리는 백업 파일 없이 구성할 수 있지만 이식성에 영향을 미칠 수 있습니다. 내 예는 메모리 액세스 (속도) 및 파일 저장소 (지 속성)의 이점을 결합 하는 백업 파일과 POSIX API를 사용 합니다. 총 4개의 데이터 복사본이 필요합니다(읽기 2개 및 쓰기 2개). 따라서 공유 메모리는 둘 이상의 프로세스가 메모리 세그먼트를 공유하도록 하는 방법을 제공합니다. 공유 메모리를 사용하면 입력 파일에서 공유 메모리로, 공유 메모리에서 출력 파일까지 두 번만 데이터가 복사됩니다. 표준 I/O 라이브러리에는 파일의 배타적 잠금과 공유 잠금을 검사하고 조작하는 데 사용할 수 있는 fcntl이라는 유틸리티 함수가 포함되어 있습니다. 이 함수는 프로세스 내에서 파일을 식별하는 음수가 아닌 정수 값인 파일 설명자(file 설명자)를 통해 작동합니다. (다른 프로세스의 파일 설명자가 동일한 물리적 파일을 식별할 수 있습니다.) 파일 잠금을 위해 Linux는 fcntl 주위의 얇은 래퍼인 라이브러리 함수 무리를 제공합니다.
첫 번째 예제에서는 fcntl 함수를 사용하여 API 세부 정보를 노출합니다. 클라이언트 부분은 서버와 유사합니다. 상태가 채워지때까지 기다립니다. 그런 다음 클라이언트는 데이터를 검색하고 상태를 TAKEN으로 설정하여 데이터가 수행되었음을 서버에 알린습니다. 다음은 클라이언트 프로그램입니다. 이 서버 프로그램 client.c의 사본을 다운로드하려면 여기를 클릭하십시오. shmdt(): 공유 메모리 세그먼트를 완료하면 shmdt()를 사용하여 프로그램에서 자체적으로 분리해야 합니다. int shmdt (보이드 *shmaddr); memwriter 프로그램이 성공적으로 실행되면 시스템은 백업 파일을 만들고 유지 관리합니다. 내 시스템에서 파일은 /dev /shm/shMemEx이며 shMemEx는 공유 저장소에 대한 내 이름 (헤더 파일 shmem.h에 있음)으로 제공됩니다. memwriter 및 memreader 프로그램의 현재 버전에서, 문: 여기에 명령줄 프롬프트와 함께 동일한 터미널에서 시작 된 두 프로그램의 출력: memreader, memwriter 처럼, 에 그것의 이름을 통해 세마포에 액세스 sem_open으로 호출합니다.
그러나 memreader는 memwriter가 초기 값이 0인 세마포를 증분할 때까지 대기 상태로 전환됩니다. 서버는 ftok()를 사용하여 키를 생성하고 공유 메모리를 요청하는 데 사용합니다. 공유 메모리가 데이터로 채워지기 전에 상태가 NOT_READY로 설정됩니다. 공유 메모리가 채워진 후 서버는 상태를 채우는 상태로 설정합니다. 그런 다음 서버는 상태가 TAKEN될 때까지 대기하므로 클라이언트가 데이터를 가져온 것입니다. 다음은 memwriter 및 memreader 프로그램이 공유 메모리를 통해 통신하는 방법에 대한 개요입니다: 대기가 끝나면 memreader는 공유 메모리에서 ASCII 바이트를 읽고 정리하고 종료합니다. shmget 및 mmap의 두 가지 방법이 있습니다. 나는 mmap에 대해 이야기 할 것이다, 그것은 더 현대적이고 유연하기 때문에,하지만 당신은 오히려 오래된 스타일의 도구를 사용하는 경우 남자 shmget (또는이 튜토리얼)을 살펴 수 있습니다. mmap에 대한 첫 번째 인수는 NULL이며, 이는 시스템이 가상 주소 공간에서 메모리를 할당할 위치를 결정한다는 것을 의미합니다.