【进程间通信】------二元信号量P/V操作,封装成动态/静态库,并分别使用并测试

1、信号量相关代码生成静态库

comm.h

 1 #include <stdio.h>                                                                                                                                                                                                                                                                                                        
  2 #include <sys/types.h>
  3 #include <sys/ipc.h>
  4 #include <sys/sem.h>
  5 
  6 
  7 #define PATHNAME "."
  8 #define PROJ_ID 0x6666
  9 
 10 union semun{
 11     int val;
 12     struct semid_ds *buf;
 13     unsigned short *arr;
 14     struct seminfo *_buf;
 15 };
 16 int cerateSemSet(int nums);
 17 int initSem (int semid,int nums,int initVal);
 18 int P(int semid,int who);
 19 int V(int semid,int who);
 20 int destroySemSet(int semid);
 21 
 22 
 23 

comm.c

  1 #include "comm.h"
  2 static int commSemSet(int nums,int flags){
  3     key_t _key=ftok(PATHNAME,PROJ_ID);
  4     if(_key<0){
  5         perror("ftok");
  6         return -1;
  7     }
  8     int semid=semget(_key,nums,flags);
  9     if(semid<0){
 10         perror("semget");
 11         return -2;
 12     }
 13     return semid;
 14 }
 15 
 16 int createSemSet(int nums){
 17     return commSemSet(nums,IPC_CREAT|IPC_EXCL|0666);
 18     }
 19 int getSemSet(int nums){
 20     return commSemSet(nums,IPC_CREAT);
 21 }
 22 int initSem(int semid,int nums,int initVal){
 23     union semun _un;
 24     _un.val=initVal;
 25     if(semctl(semid,nums,SETVAL,_un)<0){
 26         perror("semctl");
 27         return -1;
 28     }
 29     return 0;
 30 }
 31 
 32 static int commPV(int semid,int who,int op){
 33     struct sembuf _sf;
 34     _sf.sem_num=who;
 35     _sf.sem_op=op;
 36     _sf.sem_flg=0;
 37     if(semop(semid,&_sf,1)<0){
 38         perror("semop");
 39         return -1;
 40     }
 41     return 0;
 42 }
 43 
 44 int P(int semid,int who){
 45     return commPV(semid,who,-1);
 46 }
 47 int V(int semid,int who){
 48     return commPV(semid,who,1);
 49 }
 50 int destroySemSet(int semid)
 51 {
 52     if(semctl(semid,0,IPC_RMID)<0){
 53         perror("semctl");
 54         return -1;
 55     }
 56 }

sem.c

1 #include "comm.h"
  2 
  3 int main()
  4 {
  5     int semid=createSemSet(1);
  6     initSem(semid,0,1);
  7     pid_t id=fork();
  8     if(id==0){
  9         int _semid=getSemSet(0);
 10         while(1){
 11             P(_semid,0);
 12             printf("A");
 13             fflush(stdout);
 14             usleep(100000);
 15             printf("A");
 16             fflush(stdout);
 17             usleep(100000);
 18             V(_semid,0);
 19         }
 20     }
 21     else {
 22         while(1){
 23             P(semid,0);
 24             printf("B");
 25             fflush(stdout);
 26             usleep(100000);
 27             printf("B");
 28             fflush(stdout);
 29             usleep(100000);
 30             V(semid,0);
 31         }
 32             wait(NULL);
 33         }
 34         destroySemSet(semid);
 35         return 0;
 36 }                                                                                                                                                                                                                                        

我们在生成静态库的时候首先得就是先生成静态库,我们这个以前已经实现过了,在这里就不再进行说明了,当我们的静态库生成以后,我们就可以编译进行运行程序了。这样我们就实现了一个静态库。
这里写图片描述

2、实现动态库

程序在上面我已经写到 ,在这里我就不再进行写入了。
首先我们需要的是生成动态库
这里写图片描述
我们在进行编译的时候发现不能通过编译,在以前的时候,我们也遇到类似的情况,以下提供的解决的办法:
这里写图片描述
最后我们在编译的时候发现我们的文件已经存在了,我的解决办法已经在下面链接中体现了:https://blog.csdn.net/daboluo521/article/details/80036983

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值