리눅스 shared memory 예제

shmat을 사용하여 shmid로 식별 된 공유 메모리 세그먼트를 호출 프로세스의 주소 공간에 연결하여 memwriter 및 memreader 프로그램은 세마포 코드가 제거된 경우에도 경합 조건을 유도하지 않고 실행될 가능성이 있습니다. 공유 메모리 세그먼트에 즉시 기록합니다. memreader는 이 메모리를 만들 때까지 공유 메모리에 액세스할 수도 없습니다. 그러나 가장 좋은 방법은 쓰기 작업이 혼합되어 있을 때마다 공유 메모리 액세스가 동기화되어야 하며 세마포어 API는 코드 예제에서 강조 표시될 만큼 중요합니다. Linux 시스템은 공유 메모리에 대해 레거시 시스템 V API와 최신 POSIX API의 두 가지 별도 API를 제공합니다. 그러나 이러한 API는 단일 응용 프로그램에서 혼합해서는 안 됩니다. POSIX 접근 방식의 단점은 기능이 아직 개발 중이며 코드 이식성에 영향을 주는 설치된 커널 버전에 따라 달라지는 것입니다. 예를 들어 POSIX API는 기본적으로 공유 메모리를 메모리 매핑 된 파일로 구현합니다. POSIX에서 공유 메모리는 백업 파일 없이 구성할 수 있지만 이식성에 영향을 미칠 수 있습니다. 내 예는 메모리 액세스 (속도) 및 파일 저장소 (지 속성)의 이점을 결합 하는 백업 파일과 POSIX API를 사용 합니다. 기본적으로 시나리오는 사용자가 프로그램을 시작할 때 공유 메모리에 두 개의 값을 저장해야한다는 것입니다: char_path인 current_path와 char*인 file_name. 프로그래머는 프로그램에서 파일의 사용을 설정하는 많은 함정 (존재하지 않는 파일, 잘못된 파일 권한 등)을 포함하여 파일 액세스에 너무 익숙합니다.

그럼에도 불구하고 공유 파일은 가장 기본적인 IPC 메커니즘일 수 있습니다. 한 프로세스(생산자)가 파일을 만들고 쓰고 다른 프로세스(소비자)가 이 파일에서 읽는 비교적 간단한 경우를 고려하십시오. 당신이 나를 지시 할 수있는 예제 코드 (가능한 경우)와 공유 메모리에 좋은 튜토리얼? shmget(): int shmget (key_t, size_tsize, intshmflg); 성공적으로 완료되면 shmget()은 공유 메모리 세그먼트에 대한 식별자를 반환합니다.