shmdt 예제
y posteado en Sin categoría

shmdt()는 호출 프로세스의 주소 공간에서 shmaddr가 지정한 주소에 있는 공유 메모리 세그먼트를 분리합니다. 분리할 세그먼트는 현재 연결 shmat() 호출에서 반환된 값과 동일한 shmaddr로 연결되어야 합니다. 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); shmop 시스템 호출에 대 한 예제 프로그램은 다음과 같습니다. 소스 프로그램 파일 shmop.c 및 실행 파일 shmop의 이름을 지정하는 것이 좋습니다. 이 루프에서 프로그램은 공유 메모리 세그먼트의 주소를 분리하라는 메시지를 표시합니다(줄 81-85); laddr 변수(줄 86)에 저장되고 포인터(줄 88)로 변환됩니다. 이어서, shmdt 시스템 호출이 수행된다(라인 89). 성공하면 세그먼트가 분리된 주소와 함께 이렇게 표시되는 메시지가 표시됩니다(95, 96줄). 실패하면 오류 번호가 표시됩니다(92줄). 루프가 완료될 때까지 계속됩니다. shmdt 함수는 프로세스에서 공유 메모리 세그먼트를 분리하는 데 사용됩니다.

호출 프로세스가 연결된 유일한 프로세스인 경우에도 세그먼트가 소멸되지 않습니다. 공유 메모리 세그먼트에 대한 일반적인 정보는 섹션 shmget의 shmget 함수 설명을 참조하십시오. 이 예제 프로그램은 shmat 및 shmdt 시스템 호출을 모두 결합합니다. 프로그램은 첨부 파일 수를 묻는 메시지를 표시하고 지정된 공유 메모리 식별자에 대해 수행될 때까지 루프를 입력합니다. 그런 다음 프로그램에서 수행할 분리 수를 묻는 메시지를 표시하고 지정된 공유 메모리 세그먼트 주소에 대해 수행될 때까지 루프를 입력합니다. `shmop 시스템 호출 예`는 메뉴 기반 프로그램입니다. shmat 및 shmdt 시스템 호출을 사용하는 모든 가능한 조합을 연습 할 수 있습니다. 이 루프에서 프로그램은 공유 메모리 세그먼트 식별자(줄 26-29)를 묻는 메시지를 표시합니다. shmid 변수(줄 30)에 저장됩니다. 다음으로 세그먼트가 연결될 주소에 대한 메시지가 표시됩니다(줄 32-36). laddr 변수(줄 37)에 저장되고 포인터(줄 39)로 변환됩니다. 그런 다음 프로그램은 첨부 파일(줄 40-47)에 사용할 원하는 플래그를 묻는 메시지를 표시하고 플래그를 나타내는 코드는 플래그 변수(줄 48)에 저장됩니다.

플래그 변수는 shmat 시스템 호출(49-60 줄)에 전달하는 데 사용되는 shmflg 변수에 대해 저장할 코드를 결정하기 위해 테스트됩니다. 시스템 호출이 실행됩니다(63호선). 성공하면 첨부 주소(줄 68-70)와 함께 이렇게 표시되는 메시지가 표시됩니다. 실패하면 이렇게 설명하는 메시지가 표시되고 오류 코드가 표시됩니다(줄 65). 그런 다음 루프가 완료될 때까지 계속됩니다. 이 프로그램을 공부하면서 인수를 전달하고 반환 값을 받는 방법을 관찰할 수 있습니다. 사용자가 작성한 프로그램 요구 사항이 지적됩니다. (Linux 별) SHM_REMAP 플래그는 세그먼트의 매핑이 shmaddr에서 시작하여 세그먼트의 크기에 대해 계속되는 범위의 기존 매핑을 대체해야 함을 나타내기 위해 shmflg에 지정될 수 있습니다. 일반적으로 이 주소 범위에 매핑이 이미 있는 경우 EINVAL 오류가 발생합니다.

이 경우 shmaddr는 NULL이 아니어야 합니다. shmaddr가 NULL인 경우 시스템은 세그먼트를 첨부할 적합한(사용되지 않은) 주소를 선택합니다. . . 23 스캔(“%d”, 및 첨부); 24 printf(“부착 수 = %dn”, 첨부); 62 /*shmat 시스템 호출을 수행합니다.*/ 63 가산기 = shmat (shmid, addr, shmflg); 64 if(addr == (char*) -1) { 65 printf(“nShmat 실패, 오류 = %dn”, errno); 66 } 67 else { 68 printf (“nShmat이 성공했다”); 69 printf (“shmid = %dn”, shmid); 70 printf (“주소 = 0x % lx n”, (long)addr); 71 } 72 }

Compartir este contenido...
Tweet about this on TwitterShare on FacebookShare on Google+Email this to someone
Los Comentarios están cerrados.