semctl(2)

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int semctl(int semid, int semnum, int cmd, ...);

semctl(2)은 semid에 의해 식별된 System V semaphore set이나 semaphore set의 semnum번째(0부터 시작함)에 대해 제어를 하는 함수입니다.  semctl(2)의 파라미터는 cmd값에 따라서 3 ~ 4개의 parameter를 갖습니다. cmd값에 따라 아래와 같은 조합으로 실행될 수 있습니다.

int semctl(int semid, 0(무시됨),  IPC_RMID);
  - semid로 식별되는 semaphore set을 삭제합니다.

int semctl(int semid, 0(무시됨),  IPC_STAT, struct semid_ds *buf);
  - semid로 식별되는 semaphore set의 정보를 읽어서 buf에 저장합니다.

int semctl(int semid, 0(무시됨),  IPC_SET,  struct semid_ds *buf);
  - semid로 식별되는 semaphore set의 정보를 buf의 값으로 변경합니다.
  - 구조체 semid_ds의 sem_perm.uid, sem_perm.gid, sem_perm.mode를 변경할 수 있으며, sem_ctime값도 update됩니다.

int semctl(int semid, 0(무시됨),  GETALL,   unsigned short  *array);
  - semid로 식별되는 semaphore set의 모든 배열값을 array에 저장합니다.

int semctl(int semid, 0(무시됨),  SETALL,   unsigned short  *array);
  - semid로 식별되는 semaphore set의 모든 배열값을 array의 값으로 설정 또는 변경합니다.

int semctl(int semid, int semnum, GETVAL);
  - semid로 식별되는 semaphore set의 semnum번째 배열의 값(semval)을 얻습니다.

int semctl(int semid, int semnum, SETVAL,   int val);
  - semid로 식별되는 semaphore set의 semnum번째 배열의 값(semval)을 설정 또는 변경합니다.

int semctl(int semid, int semnum, GETNCNT);
  - semid로 식별되는 semaphore set의 semnum번째 배열의 값(semval)이 현재값보다 증가되기를 기다리는 process의 수를 return 합니다.

int semctl(int semid, int semnum, GETZCNT);
  - semid로 식별되는 semaphore set의 semnum번째 배열의 값(semval)이 0이 되기를 기다리는 process의 수를 return 합니다.

int semctl(int semid, int semnum, GETPID);
  - semid로 식별되는 semaphore set의 semnum번째 배열을 최종 처리한 process의 ID를 return 합니다.

/* 네번째 파라미터는 union이기 때문에, member의 type으로 실행해도 됩니다. */
union semun {
   int              val;    /* Value for SETVAL */
   struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
   unsigned short  *array;  /* Array for GETALL, SETALL */
};


The semid_ds data structure is defined in <sys/sem.h> as follows:
struct semid_ds {
   struct ipc_perm sem_perm;  /* Ownership and permissions */
   time_t          sem_otime; /* Last semop time */
   time_t          sem_ctime; /* Last change time */
   unsigned long   sem_nsems; /* No. of semaphores in set */
};

struct ipc_perm {
   key_t          __key; /* Key supplied to semget(2) */
   uid_t          uid;   /* Effective UID of owner */
   gid_t          gid;   /* Effective GID of owner */
   uid_t          cuid;  /* Effective UID of creator */
   gid_t          cgid;  /* Effective GID of creator */
   unsigned short mode;  /* Permissions */
   unsigned short __seq; /* Sequence number */
};

 

 

파라미터

semid
    - semget(2)함수가 return한 System V semaphore set ID.
semnum
    - semaphore set의 배열의 처리할 index(번째).

      cmd의 값이 IPC_RMID, IPC_STAT, IPC_SET, GETALL, SETALL 이면 값이 무시됩니다.
cmd
    - 처리할 명령어값.

 IPC_RMID : semid로 식별되는 semaphore set을 삭제합니다.
 IPC_STAT : semid로 식별되는 semaphore set의 정보를 읽어 struct semid_ds에 저장합니다.
 IPC_SET : semid로 식별되는 semaphore set의 정보를 struct semid_ds *buf값으로 변경합니다.
     변경가능한 항목은 struct semid_ds의 sem_perm.uid, sem_perm.gid, sem_perm.mode를 변경할 수 있으며, 
     sem_ctime값도 update됩니다.
 GETALL : semaphore set의 모든 배열값을 array에 저장합니다.
 SETALL : semaphore set의 모든 배열값을 array의 값으로 설정 또는 변경합니다.
 GETVAL : semaphore set의 semnum번째 배열의 값(semval)을 얻습니다.
 SETVAL : semaphore set의 semnum번째 배열의 값(semval)을 설정 또는 변경합니다.
 GETNCNT: semaphore set의 semnum번째 배열의 값(semval)이 현재값보다 증가되기를 
          기다리는 process의 수를 return 합니다.
 GETZCNT: semaphore set의 semnum번째 배열의 값(semval)이 0이 되기를 
          기다리는 process의 수를 return 합니다.
 GETPID : semaphore set의 semnum번째 배열을 최종 처리한 process의 ID를 return 합니다.
...
    - cmd의 값에 따라 사용여부 및 데이터 type이 결정됨

/* 네번째 파라미터는 union이기 때문에, member의 type으로 실행해도 됩니다. */
union semun {
   int              val;    /* Value for SETVAL */
   struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
   unsigned short  *array;  /* Array for GETALL, SETALL */
};

The semid_ds data structure is defined in <sys/sem.h> as follows:

struct semid_ds {
   struct ipc_perm sem_perm;  /* Ownership and permissions */
   time_t          sem_otime; /* Last semop time */
   time_t          sem_ctime; /* Last change time */
   unsigned long   sem_nsems; /* No. of semaphores in set */
};

struct ipc_perm {
   key_t          __key; /* Key supplied to semget(2) */
   uid_t          uid;   /* Effective UID of owner */
   gid_t          gid;   /* Effective GID of owner */
   uid_t          cuid;  /* Effective UID of creator */
   gid_t          cgid;  /* Effective GID of creator */
   unsigned short mode;  /* Permissions */
   unsigned short __seq; /* Sequence number */
};

 

RETURN

-1이 아님
    - cmd의 값이 아래와 같을 때,

GETNCNT : semnum번째 배열의 현재값보다 증가 되기를 기다리는 process의 수를 return합니다.
GETPID  : semnum번째 배열을 마지막으로 처리한 porcess id를 return합니다.
GETVAL  : semnum번째 배열의 semaphore값(semval)을 return 합니다.
GETZCNT : semnum번째 배열의 값이 0이 되기를 기다리는 process의 수를 return 합니다.

-1
     - 오류가 발생하였으며, 상세한 오류는 errno에 설정됩니다.

 EACCES : cmd의 값이 GETALL, GETPID, GETVAL, GETNCNT, GETZCNT, IPC_STAT, SEM_STAT, SETALL, SETVAL일 때, 
          semaphore 정보값을 조회 또는 설정할 수 있는 권한이 없습니다.
 EFAULT : 4번째 파라미터의 값이 유효한 address가 압니다.
 EIDRM  : semaphore set이 삭제되었습니다.
 EINVAL : cmd나 semid 값이 유효하지 않습니다.
 EPERM  : cmd의 명령값이 IPC_SET 또는 IPC_RMID이면서 처리 권한이 없습니다.
 ERANGE : cmd의 값이 SETALL, SETVAL 일 때, 
          set에 설정할 semaphore의 값이 0보다 작거나 SEMVMX보다 클때에 발생합니다. 

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요