shmat 예제

shmat(): 공유 메모리 세그먼트를 사용하려면 shmat()를 사용하여 자신을 연결해야 합니다. 보이드 *shmat (int shmid, 보이드 * shmaddr, int shmflg); shmid는 공유 메모리 ID입니다. shmaddr는 사용할 특정 주소를 지정하지만 0으로 설정해야하며 OS는 자동으로 주소를 선택합니다. shmat() 함수는 XSI 공유 메모리에서 작동합니다(IEEE Std 1003.1-2001, 섹션 3.340, 공유 메모리 개체의 기본 정의 볼륨 참조). 이 함수가 실시간에 정의된 실시간 프로세스 간 통신 기능과 상호 작동하는지 여부는 지정되지 않습니다. Windows 9x에서 shmat()은 0x8000000과 0xbfffff ff 사이의 주소로 항목을 매핑하는 데만 사용할 수 있습니다. 이것은 MapViewOfFileEx()의 제한, 그리고 궁극적으로, 윈도우 9x 메모리 관리자 때문입니다. 윈도우 NT는 이러한 제한이 없습니다. Windows에서는 연결된 공유 메모리 영역을 64K 경계에 정렬해야 합니다. 고정 된 주소와 shmat()를 사용 하려고 하는 경우이 주소는 64 K 정렬 되어 있는지 확인 해야 합니다. shmat() 함수는 shmid가 지정한 공유 메모리 식별자와 연결된 공유 메모리 세그먼트를 호출 프로세스의 주소 공간에 연결합니다. 세그먼트는 다음 조건 중 하나에 의해 지정된 주소에 첨부됩니다: shmdt(): 공유 메모리 세그먼트로 완료되면 shmdt()를 사용하여 프로그램에서 자체적으로 분리해야 합니다.

int shmdt (보이드 *shmaddr); . shmctl () : 공유 메모리에서 분리하면 파괴되지 않습니다. 그래서, shmctl()을 파괴하는 것이 사용된다. shmctl (int shmid, IPC_RMID, NULL); shmaddr가 null 포인터인 경우 세그먼트는 시스템에서 선택한 첫 번째 사용 가능한 주소에 연결됩니다. (shmflg 및 SHM_RDONLY)가 0이 아닌 경우(shmflg 및 SHM_RDONLY)가 읽기 권한이 있는 경우(shmflg 및 SHM_RDONLY) 읽기 권한이 있고 호출 프로세스가 0이고 호출 프로세스가 읽기 및 쓰기 권한이 있는 경우 세그먼트가 읽기 및 쓰기를 위해 첨부됩니다. shmaddr이 null 포인터가 아니고 (shmflg & SHM_RND)가 0이 아닌 경우 세그먼트는 주어진 주소에 첨부됩니다 (shmadptr_t)shmaddr %SHMLBA). 문자 `%`는 C 언어 나머지 연산자입니다. 공유 메모리를 통한 프로세스 간 통신은 둘 이상의 프로세스가 공통 메모리에 액세스할 수 있는 개념입니다. 또한 한 프로세스의 변경 내용을 다른 프로세스에서 볼 수 있는 이 공유 메모리를 통해 통신이 수행됩니다. shmget(): int shmget (key_t, size_tsize, intshmflg); 성공적으로 완료되면 shmget()은 공유 메모리 세그먼트에 대한 식별자를 반환합니다. 총 4개의 데이터 복사본이 필요합니다(읽기 2개 및 쓰기 2개).

따라서 공유 메모리는 둘 이상의 프로세스가 메모리 세그먼트를 공유하도록 하는 방법을 제공합니다. 공유 메모리를 사용하면 입력 파일에서 공유 메모리로, 공유 메모리에서 출력 파일까지 두 번만 데이터가 복사됩니다. . 파이프, fifo 및 메시지 큐의 문제는 두 프로세스가 정보를 교환한다는 것입니다. 정보는 커널을 통과해야 합니다. POSIX 실시간 확장은 프로세스 간 통신을 위한 대체 인터페이스를 정의합니다. IPC를 사용해야 하는 응용 프로그램 개발자는 XSI 프로세스 간 통신에 설명된 IPC 루틴을 사용하는 모듈을 쉽게 수정하여 대체 인터페이스를 사용할 수 있도록 응용 프로그램을 디자인해야 합니다. . 구현할 특정 공유 메모리 조건 및 옵션을 나타내는 플래그 집합을 지정합니다. POSIX 실시간 확장 IPC 루틴 사용에 대한 메모가 향후 방향에서 새 응용 프로그램 사용 섹션으로 이동되었습니다.

shmaddr는 0과 같지 않으며 값 (shmaddr – shmaddr % SHMLBA))은 불법 주소입니다.