Red de conocimiento informático - Aprendizaje de programación - ¿Qué es un semáforo de Linux y cómo usarlo?

¿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