shmctl 예제

`shmctl 시스템 호출 예`는 메뉴 기반 프로그램입니다. 그것은 shmctl 시스템 호출을 사용 하 여 의 모든 가능한 조합을 행사 할 수 있습니다. IPC_SET 제어 명령이 선택된 경우(코드 2) 가장 먼저 수행되는 작업은 지정된 공유 메모리 식별자(줄 88-90)에 대한 현재 상태 정보를 얻는 것입니다. 이 예제 프로그램은 한 번에 하나의 멤버만 변경하기 위해 제공되고 시스템 호출이 모두 변경되므로 이 필요합니다. 또한 이러한 멤버 중 하나에 대해 잘못된 값이 사용자 메모리 영역에 저장되는 경우 수정될 때까지 이 제어 명령에 대한 반복적인 오류가 발생합니다. 프로그램이 수행하는 다음 일은 멤버에 해당하는 코드를 변경하라는 메시지를 표시하는 것입니다(91-96줄). 이 코드는 선택 변수(줄 97)에 저장됩니다. 이제 선택한 멤버에 따라 프로그램이 새 값(98-120 줄)을 묻는 메시지를 표시합니다. 값은 사용자 메모리 영역 데이터 구조의 적절한 부재에 배치되고 시스템 호출이 이루어진다(줄 121-128). 성공 또는 실패에 따라 프로그램은 위의 IPC_STAT와 동일한 메시지를 반환합니다. 130 대 4: /*잠금 공유 메모리 세그먼트*/ 131 rtrn = shmctl (shmid, SHM_LOCK, (구조체 shmid_ds *) NULL); 132 휴식; 133 대/경우 5: /*공유 메모리 134 세그먼트 잠금 해제.*/ 135 rtrn = shmctl (shmid, SHM_UNLOCK, (구조체 shmid_ds *) NULL); 136 휴식; 137 } 138 /*호출이 실패한 경우 다음을 수행합니다.*/ 139 if(rtrn == -1) 140 {41 printf(“nThe shmctl 호출 실패, 오류 번호 = %dn”, errno); 142 } 143 /*성공 시 shmid반환 성공 시 shmid를 반환합니다.*/ 144 다른 144 shmid = %dn”, 146 shmid); 147 출구 (0); 148 } shmctl 시스템 호출에 대 한 예제 프로그램은 다음과 같습니다. 소스 프로그램 파일 shmctl.c 및 실행 파일 shmctl의 이름을 지정하는 것이 좋습니다. 18 /*shmid 및 명령을 가져옵니다.*/ 19 printf (“shmid = “입력) 20 스캔(“%d”, 및 shmid); 21 printf(“n”에 대한 숫자를 입력합니다); 22 printf(“원하는 명령:n”); shm_info { int used_ids; /* #현재 기존 세그먼트 */ 서명되지 않은 긴 shm_tot; /* 공유 메모리 페이지의 총 수 */ 서명되지 않은 긴 shm_rss; /* # 상주 공유 메모리 페이지 */ 서명되지 않은 긴 shm_swp; /* # 스왑된 공유 메모리 페이지 */ 서명되지 않은 공유 메모리 페이지 */ 긴 스왑_시도; /* 리눅스 이후 사용 되지 않는 2.4 */ 서명 되지 않은 긴 swap_successs; /* 리눅스 이후 사용하지 않은 2.4 */ }; IPC_RMID 명령은 커널에서 세그먼트를 실제로 제거하지 않습니다.

오히려 제거를 위해 세그먼트를 표시합니다. 실제 제거 자체는 현재 세그먼트에 연결된 마지막 프로세스가 제대로 분리된 경우 발생합니다. 물론, 어떤 프로세스가 현재 세그먼트에 연결되어있지 않은 경우, 제거는 즉시 보인다. 세그먼트에 대한 shmid_ds 구조의 ipc_perm 멤버 값을 설정합니다. buf 인수에서 값을 취합니다. 5 /*필요한 헤더 파일 포함.*/ 6 #include 7 #include 8 #include 9 #include 오류, -1이 반환되고 errno가 적절하게 설정됩니다. 23 printf (“IPC_STAT = 1n”); 24 printf (“IPC_SET = 2n”); 25 printf (“IPC_ _ RMID = 3n”); 26 인쇄기(“SHM_LOCK = 4n”); 27 인쇄기(“SHM_UNLOCK = 5n”); 28 printf(“항목 = “); 29 scanf(“%d”, 및 명령); 몇 가지 shmctl 작업을 사용하면 sys/shm.h에 정의된 구조체 shmid_ds 유형으로 매핑되는 공유 메모리 ID 데이터 구조를 얻거나 액세스할 수 있습니다. 10 /*메인 C 언어 프로그램의 시작*/ 11 main() 12 {13 extern int errno; 14 int uid, 14 int uid, 모드; 15 int rtrn, shmid, 명령, 선택; 16 구조체 shmid_ds shmid_ds, *buf; 17 buf = 및 shmid_ds; ipc_perm 구조는 다음과 같이 (강조 표시된 필드는 IPC_SET을 사용하여 설정할 수 있음) 에 정의됩니다.