semop 예제

마지막으로 sem_op이 0(0)이면 세마포의 값이 0이 될 때까지 호출 프로세스가 절전()됩니다. 이것은 세마포가 100% 이용률에 도달할 때까지 기다리는 것과 관련이 있습니다. 이 것의 좋은 예는 전체 사용률에 도달 하는 경우 세마포 세트의 크기를 동적으로 조정할 수 있는 수퍼 유저 사용 권한이 실행 되는 데몬 것입니다. 예를 들어, 데모 프로그램 semdemo.c, 아래, 일반적으로 스티븐스의 코드를 다시 구현 하는 참조. `semop 시스템 호출 예`는 메뉴 기반 프로그램입니다. 그것은 semop 시스템 호출을 사용하는 모든 가능한 조합을 행사 할 수 있습니다. 89 /*semop 시스템 호출을 수행합니다.*/ 90 retrn = semop (세미, sops, nsops); 91if(retrn == -1) { 92 printf(„nSemop 실패, 오류 = %dn“, errno); 93 } 94 else { 95 printf („nSemop는 성공적“); 96 printf („세미 = %dn“, 세미); semop 시스템 호출에 대한 예제 프로그램은 다음과 같습니다. 소스 프로그램 파일 semop.c 및 실행 파일 semop의 이름을 지정하는 것이 좋습니다. 이 문서에서는 세마포 기능에 대한 개요를 제공하고 세마포를 사용하여 파일에 대한 액세스를 제어하는 프로그램으로 끝납니다. 이 작업은 파일 잠금으로 쉽게 처리 할 수 있지만 공유 메모리보다 머리를 감싸는 것이 더 쉽기 때문에 좋은 예입니다.

세마포를 제거하는 방법에는 두 가지가 있습니다: 하나는 유닉스 명령 ipcrm을 사용하는 것입니다. 다른 하나는 cmd를 IPC_RMID로 설정한 semctl()에 대한 호출을 통해서입니다. 지금, 당신은 감소 또는 당신이 필요로하는 세마포를 증가 시킬 수 있습니다. 중요한 섹션의 시작 부분에서 semop() 함수를 사용하여 카운터를 줄입니다. semop() 함수는 세미인수에 의해 지정된 세마포 식별자와 연관된 세마포 세트에 대한 사용자 정의 세마포 작업 배열을 원자적으로 수행해야 한다. semid는 semget() 호출에서 얻을 수 있는 세마포 세트 ID입니다. semnum은 값을 조작하려는 세마포의 ID입니다. cmd는 문제의 세마포와 함께하고 싶은 것입니다. 마지막 „인수“, „arg“, 필요한 경우, 다음 중 하나가 될 코드에서 당신에 의해 정의 될 것입니다 연합 세문이 될 필요가 : sem_op에 의해 지정된 각 세마포 작업은 세미 및 sem_num. 스티븐스에 의해 지정된 해당 세마포에 수행된다 세마포의 „치명적인 결함“으로이 문제. 그는 IPC_EXCL 플래그로 세마포 세트를 만들어 해결합니다.

프로세스 1이 먼저 생성되면 프로세스 2가 호출시 오류를 반환합니다(errno가 EEXIST로 설정). 이 시점에서 프로세스 2는 세마포가 프로세스 1에 의해 초기화될 때까지 기다려야 합니다. 어떻게 알 수 있습니까? 알고 보니 IPC_STAT 플래그를 통해 semctl()을 반복적으로 호출하고 반환된 구조체 semid_ds 구조의 sem_otime 멤버를 살펴볼 수 있습니다. 0이 아닌 경우 프로세스 1이 semop()을 사용하여 세마포에 대한 작업을 수행했다는 것을 의미합니다. sem_op이 음수 정수이고 호출 프로세스가 권한을 변경하는 경우 다음 중 하나가 발생합니다: 변수 및 구조성 이름이 시놉시스에 있는 이름과 최대한 가깝게 선택되었습니다. 그들의 선언은 자명하다. 이러한 이름은 프로그램을 더 읽기 쉽게 만들고 프로그램에 로컬이기 때문에 완벽하게 유효합니다. 이 키는 두 프로그램 모두에서 동일해야 하거나 동일한 IPC 구조를 참조하지 않습니다.

값을 하드 코딩하지 않고 합의된 키를 생성하는 방법이 있습니다. 이 집합에서 수행할 작업 수를 요청하는 메시지가 표시됩니다(줄 24-26).