# include <sys/types.h> # include <sys/ipc.h> # include <sys/sem.h> int semget ( key_t key, int nsems, int semflg )
Valor de retorno: o identificador (ou ID) do conjunto de semáforos semid, e -1 em caso de erro.
A função semget() é utilizada para criar um novo conjunto de semáforos, ou para obter o ID de um conjunto de semáforos já existentes. O primeiro argumento, key, é uma chave indicando o nome (valor numérico) de um conjunto de semáforos. O segundo argumento, nsems, indica o número de semáforos do conjunto. O último argumento, semflg, é um flag especificando os direitos de acesso ao semáforo.
Um novo conjunto de semáforos será criado se key tiver valor IPC_PRIVATE (=0), ou se ele não for IPC_PRIVATE, anenhum conjunto de semáforos existente será associado a key, e IPC_CREAT é colocado em semflg.
A presença dos campos IPC_CREAT e IPC_EXCL em semflg têm a mesma função em se tratando da existência ou não do conjunto de semáforos, que no caso das presenças de IPC_CREAT e IPC_EXCL associadas a primitiva open() apresentada no capítulo 1. Em outras palavras, a função semget falha se semflg contiver os flags IPC_CREAT e IPC_EXCL e o conjunto de semáforos já existir para uma outra chave.
O argumento semflg é definido como a combinação de diferentes constantes pré-definidas, permitindo de especificar os direitos de acesso, e os comandos de controle (usando a combinação clássica por intermédio dos operadores OU). Note que existe uma grande semelhança entre os direitos de acesso para a utilização dos semáforos e aqueles associados aos arquivos em UNIX: as mesmas noções de autorização de acesso para outros ou para o grupo são definidas da mesma forma (ver capítulo 1, seção XXXX).
As constantes utilizadas com semflg pré-definidas em <sys/sem.h> e em <sys/ipc.h> são as seguintes:
/* Mode bits for `msgget', `semget', and `shmget'. */ #define IPC_CREAT 01000 /* Create key if key does not exist. */ #define IPC_EXCL 02000 /* Fail if key exists. */ #define IPC_NOWAIT 04000 /* Return error on wait. */ /* Control commands for `msgctl', `semctl', and `shmctl'. */ #define IPC_RMID 0 /* Remove identifier. */ #define IPC_SET 1 /* Set `ipc_perm' options. */ #define IPC_STAT 2 /* Get `ipc_perm' options. */ #define IPC_INFO 3 /* See ipcs. */