进程间通信之信号量
在學習進程間通信時,信號量可能是我們會感到有點頭痛的地方。事實上,我們知道了信號量的作用再去理解信號量就會容易很多。先將信號量(System V信號量)介紹如下:
1)為什么需要使用信號量?
因為我們的系統資源是有限的,但是系統是多任務的,所以存在多進程、多線程,可能同時需要對某一個資源進行訪問,用來保證資源的有序訪問。
否則會產生不可預計的結果。
2)信號量是什么東西?
信號量是一個計數值,這個值表示當前可用的資源數,這個值也是可用是一個負數,負數的話,表示的是等待的進程數量。還有一個指針,這個指針指向等待該信號量的進程
P操作,減一操作。
V操作,加一操作。
操作屬于原子操作,是不可被打斷一種操作,一定要等待這個操作的完成。要包含的代碼要盡量段,而且不要有循環。
具體代碼如下:
#include<stdlib.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/sem.h> #include <stdio.h>union semun {int val;struct semid_df*buf;unsigned short *array; }; int sem_p(int semid) {struct sembuf sbuf;sbuf.sem_num=0; //表示對第幾個信號量作操作sbuf.sem_op=-1;//p操作,為減一操作sbuf.sem_flg=SEM_UNDO; //默認使用這個標志位if((semop(semid,&sbuf,1))==-1) //去設置這個信號量{perror("p op fail");return -1;}return 0; } int sem_v(int semid) {struct sembuf sbuf;sbuf.sem_num=0;sbuf.sem_op=1;sbuf.sem_flg=SEM_UNDO;if((semop(semid,&sbuf,1))==-1){perror("p op fail");return -1;}return 0; } int main() {key_t key;int semid,ret;pid_t pid;union semun tmp;key =ftok("/home/gec",2);//產生一個key值,用來創建一個信號量printf("key=%d",key);if(key<0){perror("ftok fail");exit(1);}//創建這個信號量 1代表信號量的個數,返回信號量的IDsemid = semget(key,1,IPC_CREAT|0777);if(semid<0){perror("semget fail");exit(-1);}tmp.val=0;//初始化信號量的初始值為0,所以下面的操作就要先用v操作來釋放這個信號量ret=semctl(semid,0,SETVAL,tmp);if(ret<0){perror("semctl fail");exit(-1);}pid = fork();if(pid < 0){perror("fork fail");exit(-1);}if(pid == 0){//因為信號量的初始值為0,所以不用p操作,如果這里也用p操作大家都會鎖死 // sem_p(semid);sleep(3);printf("Child pid :%d\n",getpid());sem_v(semid);//完了之后用V操作,回覆信號量初始值為1}else if(pid > 0){//父進程等待信號量的恢復,恢復了之后,執行P操作,然后往下執行sem_p(semid);printf("Parent pid:%d\n",getpid());//用完之后,執行V操作,恢復信號量sem_v(semid);//用完之后,把這個信號量刪除 semctl(semid,0,IPC_RMID,tmp);}return 0; }總結
- 上一篇: u盘损坏怎么弄 如何修复损坏的U盘
- 下一篇: 装系统蓝屏是怎么回事 系统蓝屏的原因及解