shmctl 예제

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 } IPC_SET 제어 명령이 선택된 경우(코드 2) 가장 먼저 수행되는 작업은 지정된 공유 메모리 식별자(줄 88-90)에 대한 현재 상태 정보를 얻는 것입니다. 이 예제 프로그램은 한 번에 하나의 멤버만 변경하기 위해 제공되고 시스템 호출이 모두 변경되므로 이 필요합니다. 또한 이러한 멤버 중 하나에 대해 잘못된 값이 사용자 메모리 영역에 저장되는 경우 수정될 때까지 이 제어 명령에 대한 반복적인 오류가 발생합니다. 프로그램이 수행하는 다음 일은 멤버에 해당하는 코드를 변경하라는 메시지를 표시하는 것입니다(91-96줄). 이 코드는 선택 변수(줄 97)에 저장됩니다. 이제 선택한 멤버에 따라 프로그램이 새 값(98-120 줄)을 묻는 메시지를 표시합니다. 값은 사용자 메모리 영역 데이터 구조의 적절한 부재에 배치되고 시스템 호출이 이루어진다(줄 121-128). 성공 또는 실패에 따라 프로그램은 위의 IPC_STAT와 동일한 메시지를 반환합니다. `shmctl 시스템 호출 예`는 메뉴 기반 프로그램입니다. 그것은 shmctl 시스템 호출을 사용 하 여 의 모든 가능한 조합을 행사 할 수 있습니다. shmctl 시스템 호출에 대한 예제 프로그램은 다음과 같습니다.

소스 프로그램 파일 shmctl.c 및 실행 파일 shmctl의 이름을 지정하는 것이 좋습니다. 오류가 발생하면 -1이 반환되고 errno가 적절하게 설정됩니다. 이 프로그램을 공부하면서 인수를 전달하고 반환 값을 받는 방법을 관찰할 수 있습니다. 사용자가 작성한 프로그램 요구 사항이 지적됩니다. cmd 인수는 shmctl에서 수행할 특정 작업을 지정하는 기호 상수로 지정해야 합니다. 상수 값은 아래에 설명되어 있습니다. 세그먼트에 대한 shmid_ds 구조를 검색하고 buf 인수 변수 및 구조체 이름의 주소에 저장하여 시스템 호출의 개요에 있는 구조이름과 최대한 가깝게 선택되었습니다. 그들의 선언은 자명하다.

이러한 이름은 프로그램을 더 읽기 쉽게 만들고 프로그램에 로컬이기 때문에 완벽하게 유효합니다. 18 /*shmid 및 명령을 가져옵니다.*/ 19 printf (“shmid = “입력) 20 스캔(“%d”, 및 shmid); 21 printf(“n”에 대한 숫자를 입력합니다); 22 printf(“원하는 명령:n”); 구조형 shmid_ds의 다양한 필드는 Linux 2.2에서 반바지였으며 Linux 2.4에서 긴 길이되었습니다. 이를 활용하려면 glibc-2.1.91 이하의 재컴파일만으로도 충분합니다. (커널은 iPC_64 플래그를 cmd로 구별합니다.) IPC_STAT 제어 명령이 선택되면(코드 1), 시스템 호출이 수행되고(줄 39, 40) 반환되는 상태 정보가 인쇄됩니다(줄 41-71). 시스템 호출에 실패(139호선)에 실패한 경우 마지막으로 성공한 호출의 상태 정보가 인쇄됩니다. 또한 오류 메시지가 표시되고 errno 변수가 인쇄됩니다(줄 141). 시스템 호출이 성공하면 메시지는 사용된 공유 메모리 세그먼트 식별자(줄 143-147)와 함께 이를 나타냅니다. 23 인쇄기(“IPC_STAT = 1n”); 24 인쇄기(“IPC_SET = 2n”); 25 인쇄물(“IPC_RMID = 3n”); 26 인쇄기(“SHM_LOCK = 4n”); 27 인쇄기(“SHM_UNLOCK = 5n”); 28 printf(“항목 = “); 29 scanf(“%d”, 및 명령); shm_info { int used_ids; /* #현재 기존 세그먼트 */ 서명되지 않은 긴 shm_tot; /* 공유 메모리 페이지의 총 수 */ 서명되지 않은 긴 shm_rss; /* # 상주 공유 메모리 페이지 */ 서명되지 않은 긴 shm_swp; /* # 스왑된 공유 메모리 페이지 */ 서명되지 않은 공유 메모리 페이지 */ 긴 스왑_시도; /* 리눅스 이후 사용 되지 않는 2.4 */ 서명 되지 않은 긴 swap_successs; /* 리눅스 이후 사용하지 않은 2.4 */ }; 33 스위치 (명령) 34 { 35 경우 1 : /*shmctl() 36shmid_ds 영역에서 36의 데이터 구조를 얻으려면 38을 가리키고 밖으로 인쇄합니다.*/ 39 rtrn = shmctl (shmid, IPC_STAT, 40 buf); 41 printf (“nUser ID”) , 42 buf->shm_perm.uid); 43 printf (“그룹 ID = %dn”, 44 buf->shm_perm.gid); 45 printf (“작성자의 ID = %dn”, 46 buf->shm_perm.cuid); 47 printf (“작성자의 그룹 ID = %dn”, 48 buf->shm_perm.cgid); 49 printf (“작업 권한 = 0%on”, 50 buf->shm_perm.mode); 51 printf (“슬롯 사용 시퀀스n”); 52 printf (“숫자 = 0%xn”, 53 buf->shm_perm.seq); 54 printf (“키 = 0 %x n”, 55 buf->shm_perm.key); 56 printf (“세그먼트 크기 = %dn”, 57 buf->shm_segsz); 58 printf (“마지막 shmop = %dn”, 59 buf->shm_lpid의 pid); 60 printf (“크리에이터의 파이드 = %

Ο ΚΑΙΡΟΣ
facebook
facebook
ΑΡΙΘΜΟΣ ΕΠΕΣΚΕΠΤΩΝ
  • 0Total visitors:
  • Visitors today:
  • Visitors yesterday:
  • Visitors last week:
  • Visitors per month:
  • 0.00Visitors per day:
  • 0Visitors currently online: