sem_open 예제

다음 조건 중 어느 한 가지라도 발생하는 경우 sem_open() 함수는 SEM_FAILED를 반환하고 errno를 해당 값으로 설정할 수 있습니다: 스프린트프(semName,/%%%ldsem”), COURSEID,(long)getuid(); sem = sem_open(셈이름, O_RDWR| O_CREAT | S_IRUSR | S_IWUSR,1); $ gcc posix-세마포 – 예 .c -o posix-세마포 – 예 – lpthread $ ./posix-세마포 – 예제 스레드 1 : 1 스레드 0 : 1 스레드 2 : 1 스레드 4 : 1 … oflag 인수는 세마포가 생성되는지 아니면 sem_open()에 대한 호출에 의해 단순히 액세스되는지 여부를 제어합니다. 다음 플래그 비트를 설정할 수 있습니다: 프로세스에서 이름에 대해 동일한 값을 가진 sem_open()에 대해 여러 번 성공적으로 호출하는 경우, 이에 대한 sem_unlink()에 대한 호출이 없는 경우, 이러한 성공적인 호출마다 동일한 세마포어 주소가 반환됩니다. 세마포어및 이 세마포에 대한 이전의 성공적인 sem_open() 호출이 sem_close() 호출과 일치하지 않습니다. 저는 81호선에서 의문의 부름이 sem_close와 sem_unlink의 혼수상태에 대한 부름으로 대체되어야 한다고 믿습니다. 이 방법으로만 /dev/shm/*에서 sem_open에서 만든 파일을 제대로 제거할 수 있습니다. 아직 존재하지 않는 경우 세마포를 만듭니다. 세마포가 아직 존재하지 않는 경우 O_CREAT을 설정하면 O_EXECL 플래그로 표시된 것 외에는 아무런 효과가 없습니다. 세마포가 아직 존재하지 않는 경우 sem_open()이 세마포를 만듭니다. O_CREAT 플래그에는 형식 mode_t 모드와 서명되지 않은 int 형식의 값이라는 두 개의 추가 인수가 필요합니다. 값 인수는 새로 생성된 세마포에 할당된 초기 값을 지정하며 SEM_VALUE_MAX보다 작거나 같아야 합니다. 프로세스의 유효 사용자 ID는 새로 생성된 세마포의 사용자 ID로 할당되고 프로세스의 유효 그룹 ID는 세마포어의 그룹 ID로 할당됩니다.

마찬가지로 모드 인수의 값은 새로 생성된 세마포의 사용 권한 비트를 설정하는 데 사용됩니다. 프로세스의 파일 모드 생성 마스크에 설정된 비트는 세마포에 대해 설정되지 않습니다. sem_open()이 O_CREAT 플래그를 사용하여 세마포라는 이름의 이름을 만든 후에는 다른 프로세스가 동일한 이름 인수를 사용하여 sem_open() 함수를 호출하여 세마포에 연결할 수 있습니다. (((뮤텍스 = sem_open(“mysemaphore”, O_CREAT, 0644, 0)) { cerr << "세마포어 개시 오류" << 엔들; 반환 1; } 이전 예제에서 세마포는 프로세스에 국부적입니다. 스레드에서만 사용됩니다. 다른 프로세스에서는 사용하지 않습니다. 따라서 시스템 전체의 세마포 이름을 지정하고 sem_open과 같은 호출을 사용하는 것은 노력낭비처럼 보입니다. 우리가 훨씬 간단하고 효율적인 방식으로 필요한 것을 할 수있는 POSIX 이름없는 세마포가 있습니다. 먼저 시스템 호출, sem_open() 함수는 sem_wait(), sem_trywait() 및 sem_post()와 함께 사용할 수 있는 세마포 설명기를 반환합니다.

sem_close()를 호출할 때까지 사용할 수 있습니다. sem_unlink()를 호출하여 세마포의 연결을 해제할 수 있습니다. 모든 프로세스가 세마포를 연결 해제하면 파괴됩니다. 또 다른 간단한 해결책은 Vikram이 문서의 다음 섹션에서 설명하는 sem_open()을 사용하는 것입니다: sem_open의 4 매개 변수 또는 2 매개 변수 버전을 사용하고 있습니까? sem_open은 성공에 대한 세마포에 대한 포인터를 반환합니다.