¿Qué es un semáforo de Linux y cómo usarlo?
El semáforo de Linux (semáforo) es un mecanismo de exclusión mutua. Es decir, el acceso a un recurso mutuamente excluyente estará protegido por un semáforo, y el semáforo debe obtenerse antes del acceso.
Después de operar los recursos compartidos, es necesario liberar el semáforo para que otros procesos puedan obtener los recursos. La ganancia y la liberación deben venir en pares.
Obtener el conjunto de semáforos Cabe destacar que lo que se obtiene es un conjunto, no un único semáforo.
#include
#include
#include
1: int semget(key_t key,int nsems,int semflg);< Tecla /p>
: El sistema obtiene el conjunto de semáforos en función de este valor.
nsems: Este conjunto de señales incluye varios semáforos.
semflg: Crea las propiedades de este semáforo. (IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)
Devuelve el ID del conjunto de semáforos si tiene éxito.
Nota:
Cuando se especifican IPC_CREAT e IPC_EXCL, si el conjunto de semáforos ya existe en el sistema, se devolverá inmediatamente.
Si necesita obtener un semáforo existente, establezca este parámetro en 0.
2: int semctl(int semid,int senum,int cmd....)
semid: ID del semáforo.
senum: Controla el semáforo en el conjunto de semáforos. (Empieza desde 0)
cmd: La operación requerida. (SETVAL es uno de ellos).
Puede haber un cuarto parámetro dependiendo de cmd. Cuando cmd = SETVAL, significa cuántas veces se puede obtener el semáforo al mismo tiempo. Por ejemplo, el cuarto parámetro. num = 1 significa que solo se puede obtener una vez y el recurso protegido por el semáforo solo puede ser utilizado por un programa al mismo tiempo.
Esta llamada al sistema se utiliza al inicializar el semáforo.
-3: "-" se agrega antes de "3" para indicar que este paso debe realizarse cuando es necesario utilizar recursos mutuamente excluyentes.
int semop(int semid,struct sembuf *sem,int num_elements);
struct sembuf {
unsigned short sem_num //El semáforo está concentrado Cual semáforo.
int sem_op;//Necesita obtener o liberar el semáforo
int sem_flg;//Acciones relacionadas
};
num_elements: cuántos semáforos en este conjunto de semáforos deben procesarse.
Al obtener el semáforo, inicialice la estructura sembuf en:
sem_num = 0; //El primer semáforo en el conjunto de semáforos
sem_op = -1; //Obtener el semáforo
sem_flag = IPC_NOWAIT; //Si no se puede obtener el semáforo, regresar inmediatamente.
semop(semid,_sem,1);
De la misma manera, al soltar el semáforo, establezca sem_op en 1.
Lo anterior es un simple descripción del proceso del semáforo