一、信號量介紹
信號量是一種進程間通信機制,用於同步進程以及保護共享資源。它有三種類型:
- 二進制信號量:只有兩個值,0和1,用於互斥訪問共享資源。
- 計數信號量:其值可以大於1,用於同步。
- 共享內存信號量:用於控制共享內存的訪問。
Linux提供了信號量來實現進程間同步與互斥,提高了系統的並發性和可靠性。
二、信號量相關函數
在Linux中,信號量相關的函數包括:
semget
: 獲取一個信號量集合的標識符。semop
: 對信號量集合進行操作。semctl
: 對信號量集合進行控制。
int semget(key_t key, int nsems, int semflg); int semop(int semid, struct sembuf *sops, unsigned nsops); int semctl(int semid, int semnum, int cmd, ...);
semget
函數用於創建或獲取一個信號量集合的標識符,semop
函數用於對信號量集合進行操作,semctl
函數用於對信號量集合進行控制。
三、信號量示例代碼
1. 創建信號量集合
#include <stdio.h> #include <stdlib.h> #include <sys/sem.h> int main(int argc, char **argv) { key_t key = ftok(".", 'a'); int semid = semget(key, 1, IPC_CREAT | 0666); if (semid == -1) { printf("semget error\n"); exit(1); } printf("semid=%d\n", semid); return 0; }
該示例代碼實現了創建一個新的信號量集合標識符。
2. 初始化信號量集合
#include <stdio.h> #include <stdlib.h> #include <sys/sem.h> int init_sem(int semid, int val) { union semun { int val; struct semid_ds *buf; unsigned short *array; } arg; arg.val = val; return semctl(semid, 0, SETVAL, arg); } int main(int argc, char **argv) { key_t key = ftok(".", 'a'); int semid = semget(key, 1, IPC_CREAT | 0666); if (semid == -1) { printf("semget error\n"); exit(1); } if (init_sem(semid, 1) == -1) { printf("init_sem error\n"); exit(1); } printf("semid=%d\n", semid); return 0; }
該示例代碼實現了初始化一個新創建的信號量集合,將其值設置為1。
3. 獲取和釋放信號量
#include <stdio.h> #include <stdlib.h> #include <sys/sem.h> int init_sem(int semid, int val) { union semun { int val; struct semid_ds *buf; unsigned short *array; } arg; arg.val = val; return semctl(semid, 0, SETVAL, arg); } int sem_p(int semid) { struct sembuf sops = {0, -1, SEM_UNDO}; return semop(semid, &sops, 1); } int sem_v(int semid) { struct sembuf sops = {0, 1, SEM_UNDO}; return semop(semid, &sops, 1); } int main(int argc, char **argv) { key_t key = ftok(".", 'a'); int semid = semget(key, 1, IPC_CREAT | 0666); if (semid == -1) { printf("semget error\n"); exit(1); } if (init_sem(semid, 1) == -1) { printf("init_sem error\n"); exit(1); } printf("semid=%d\n", semid); sem_p(semid); printf("Enter the critical area.\n"); sem_v(semid); printf("Exit the critical area.\n"); return 0; }
該示例代碼實現了獲取和釋放信號量的操作,用於同步進程對共享資源的訪問。
四、總結
本文對Linux信號量進行了詳細介紹,包括信號量的類型、相關函數和示例代碼。信號量是一種很重要的進程間通信機制,通過它可以保護共享資源、同步進程,提高系統的並發性和可靠性。
原創文章,作者:CWIUL,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/335108.html