信號量_實現共享內存函數
1.頭文件:測試
1 #pragma once 2 3 #include <stdio.h> 4 #include <string.h> 5 #include <stdlib.h> 6 #include <sys/types.h> 7 #include <sys/ipc.h> 8 #include <sys/sem.h> 9 #include <stdlib.h> 10 #include <sys/shm.h> 11 12 union semun { 13 int val; /* Value for SETVAL */ 14 struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */ 15 unsigned short *array; /* Array for GETALL, SETALL */ 16 struct seminfo *__buf; /* Buffer for IPC_INFO 17 (Linux-specific) */ 18 }; 19 20 21 //extern int creat_sem(key_t key, int size); 22 extern void get_sem(key_t key); 23 extern void sem_init(int semid,int value); 24 extern void sem_p(int semid, int num); 25 extern void sem_v(int semid, int num); 26 extern int delet_sem(int semid);
2.函數封裝ui
1 #include "sem.h" 2 3 // 建立獲取 4 int creat_sem(key_t key, int size) 5 { 6 int semid = semget(key, size,IPC_CREAT|0666); 7 if(semid<0){ 8 perror("semget failed"); 9 exit(1); 10 } 11 return semid; 12 } 13 14 15 //初始化 16 void sem_init(int semid, int value) 17 { 18 union semun sem; 19 sem.val = value; 20 21 if( semctl(semid,0,SETVAL,sem) <0 ){ 22 perror("semctl init failed"); 23 exit(1); 24 } 25 } 26 27 28 // P操做 29 void sem_p(int semid, int num) 30 { 31 struct sembuf buf = {num,-1,0}; 32 33 if( semop(semid,&buf,1) <0 ){ 34 perror("semop failed"); 35 exit(1); 36 } 37 } 38 39 40 // V操做 41 void sem_v(int semid, int num) 42 { 43 struct sembuf buf = {num,1,0}; 44 45 if( semop(semid,&buf,1) <0 ){ 46 perror("semop failed"); 47 exit(1); 48 } 49 }
3. readspa
#include"sem.h" int main(void) { key_t key = ftok("/",0xb); // 獲取惟一鍵值 if(key<0){ perror("ftok failed"); exit(1); } int shmid = shmget(key,1024,IPC_CREAT|0666); // 建立共享內存 if(shmid<0){ perror("shmget failed"); exit(1); } int semid = creat_sem(key,1); // 建立信號量 // sem_init(shmid,0); // 初始信號量 char* buf = (char*)shmat(shmid,NULL,0); // 掛載共享內存 if(buf<0){ perror("shmat failed"); exit(1); } while(1){ // 讀 sem_p(semid,0); // P操做 fputs(buf,stdout); if(strncmp(buf,"quit",4)==0) break; sleep(1); } if( shmdt(buf) <0 ){ // 卸載共享內存 perror("shmdt failed"); exit(1); } shmctl(shmid,IPC_RMID,NULL); // 刪除共享內存 delet_sem(semid); // 刪除信號量 return 0 ; }
4. writecode
1 #include "sem.h" 2 3 int main(void) 4 { 5 6 key_t key = ftok("/",0xb); // 獲取惟一鍵值 7 if(key<0){ 8 perror("ftok"); 9 exit(1); 10 } 11 12 13 14 int shmid = shmget(key,1024,IPC_CREAT|0666); // 建立共享內存 15 if(shmid<0){ 16 perror("shmget failed"); 17 exit(1); 18 } 19 20 int semid = creat_sem(key,1); // 建立信號量 21 22 23 sem_init(semid,0); // 初始信號量 24 25 26 char* buf = (char *)shmat(shmid,NULL,0); // 掛載共享內存 27 if(buf<0){ 28 perror("shmat failed"); 29 exit(1); 30 } 31 32 33 while(1){ // 寫 34 35 fgets(buf,1024,stdin); 36 37 sem_v(semid,0); // V操做:喚醒因P操做阻塞的進程 38 39 if(strncmp(buf,"quit",4)==0) 40 break; 41 } 42 43 if( shmdt(buf) <0 ){ // 卸載共享內存 44 perror("shmdt failed"); 45 exit(1); 46 } 47 48 shmctl(shmid,IPC_RMID,NULL); // 刪除共享內存 49 50 delet_sem(semid); // 刪除信號量 51 52 return 0 ; 53 }
測試:blog
success !進程
<筆記>ip
1.注意頭文件是否遺漏 !!內存
2.信號量初始化了一次ci
3.