이 루프에서 프로그램은 공유 메모리 세그먼트의 주소를 분리하라는 메시지를 표시합니다(줄 81-85); laddr 변수(줄 86)에 저장되고 포인터(줄 88)로 변환됩니다. 이어서, shmdt 시스템 호출이 수행된다(라인 89). 성공하면 세그먼트가 분리된 주소와 함께 이렇게 표시되는 메시지가 표시됩니다(95, 96줄). 실패하면 오류 번호가 표시됩니다(92줄). 루프가 완료될 때까지 계속됩니다. 89 /*shmdt 시스템 호출을 수행합니다.*/ 90 retrn = shmdt(addr); 91 if(retrn == -1) { 92 printf(“오류 = %dn”, errno); 93 } 94 기타 { 95 printf (“nShmdt가 성공했다”); 96 printf (“주소 = 0x%lxn”, (long)addr); shmdt 함수는 프로세스에서 공유 메모리 세그먼트를 분리하는 데 사용됩니다. 호출 프로세스가 연결된 유일한 프로세스인 경우에도 세그먼트가 소멸되지 않습니다. 공유 메모리 세그먼트에 대한 일반적인 정보는 섹션 shmget의 shmget 함수 설명을 참조하십시오. `shmop 시스템 호출 예`는 메뉴 기반 프로그램입니다. shmat 및 shmdt 시스템 호출을 사용하는 모든 가능한 조합을 연습 할 수 있습니다. shmdt()는 호출 프로세스의 주소 공간에서 shmaddr가 지정한 주소에 있는 공유 메모리 세그먼트를 분리합니다. 분리할 세그먼트는 현재 연결 shmat() 호출에서 반환된 값과 동일한 shmaddr로 연결되어야 합니다.
shmop 시스템 호출에 대 한 예제 프로그램은 다음과 같습니다. 소스 프로그램 파일 shmop.c 및 실행 파일 shmop의 이름을 지정하는 것이 좋습니다. 이 예제 프로그램은 shmat 및 shmdt 시스템 호출을 모두 결합합니다. 프로그램은 첨부 파일 수를 묻는 메시지를 표시하고 지정된 공유 메모리 식별자에 대해 수행될 때까지 루프를 입력합니다. 그런 다음 프로그램에서 수행할 분리 수를 묻는 메시지를 표시하고 지정된 공유 메모리 세그먼트 주소에 대해 수행될 때까지 루프를 입력합니다. 23 스캔(“%d”, 및 첨부); 24 printf(“부착 수 = %dn”, 첨부); 포크(2) 후 자식은 연결된 공유 메모리 세그먼트를 상속합니다. SHM_RDONLY가 shmflg에 지정된 경우 세그먼트가 읽기 위해 첨부되고 프로세스가 세그먼트에 대한 읽기 권한이 있어야 합니다. 그렇지 않으면 세그먼트가 읽기 및 쓰기에 대해 첨부되고 프로세스가 세그먼트에 대한 읽기 및 쓰기 권한이 있어야 합니다. 쓰기 전용 공유 메모리 세그먼트에 대한 개념은 없습니다. shmaddr이 NULL이면 시스템은 세그먼트를 연결할 적절한(사용되지 않은) 주소를 선택합니다.
이 프로그램을 공부하면서 인수를 전달하고 반환 값을 받는 방법을 관찰할 수 있습니다. 사용자가 작성한 프로그램 요구 사항이 지적됩니다. 18 /*이 프로세스에 의한 첨부 파일 루프.*/ 19 printf(“n”의 수를 입력합니다); 20 printf (“이n”에 대한 첨부 파일); 21 printf(“프로세스(1-4)n”); 22 printf(“첨부 파일 = “); Linux에서는 이미 삭제된 것으로 표시된 경우에도 공유 메모리 세그먼트를 연결할 수 있습니다. 그러나 POSIX.1-2001이 이 동작을 지정하지 않으며 다른 많은 구현에서는 이를 지원하지 않습니다. . (Linux 별) SHM_REMAP 플래그는 세그먼트의 매핑이 shmaddr에서 시작하여 세그먼트의 크기에 대해 계속되는 범위의 기존 매핑을 대체해야 함을 나타내기 위해 shmflg에 지정될 수 있습니다. 일반적으로 이 주소 범위에 매핑이 이미 있는 경우 EINVAL 오류가 발생합니다. 이 경우 shmaddr는 NULL이 아니어야 합니다.
연결 변수와 i 카운터(23-72줄)를 사용하여 루프를 입력하여 지정된 수의 첨부 파일을 수행합니다. 구현은 프로세스당 최대 공유 메모리 세그먼트 수(SHMSEG)에 본질적인 제한을 두지 않습니다. shmaddr가 NULL이 아니고 SHM_RND가 shmflg에 지정되어 있으면 SHMLBA의 가장 가까운 배수로 반올림된 shmaddr와 동일한 주소에서 첨부가 발생합니다. 그렇지 않으면 shmaddr는 첨부가 발생하는 페이지 정렬 된 주소여야합니다. 이 프로그램에 대해 선언된 변수와 해당 변수에 대해 사용되는 변수는 다음과 같습니다. 5 /*필요한 헤더 파일 포함.*/ 6 #include 7 #include 8 #include 9 #include 10 /*주요 C 언어 프로그램*/ 11 main(11 main() 12 { 13 외래 int errno; 14 보이드 *addr; 15 긴 사다리; 16 int 플래그, i, 첨부; 17 int shmid, shmflg, retrn, 분리; SVID 3(또는 이전)에서 shmaddr 인수의 유형이 char *에서 const void *로 변경되었으며, 반환된 형식의 shmat()을 char *에서 void *로 변경했습니다.