进程间通信

信号量的代码

#############################

makefile

  1 test:test.c comm.c
  2     gcc -o $@ $^                                                                                                                                                                           
  3 
  4 .PHONY:clean
  5 clean:
  6     rm -f test
  7 

头文件

  1 #ifndef __COMM_H__                                                                                                   
  2 #define __COMM_H__
  3 
  4 #include<sys/types.h>
  5 #include<sys/ipc.h>
  6 #include<sys/sem.h>
  7 #include<stdio.h>
  8 
  9 union semun {
 10  int val; /* Value for SETVAL */
 11  struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
 12  unsigned short *array; /* Array for GETALL, SETALL */
 13  struct seminfo *__buf; /* Buffer for IPC_INFO */
 14     };
 15 #define PROJ_ID 0X6666
 16 #define PATHNAME "."
 17 int creatSemSet(int nums);
 18 int getSemSet(int nums);
 19 int P(int semid,int num);
 20 int initSemSet(int semid,int which,int val);
 21 int V(int semid,int num);
 22 int destroySemSet(int semid);
 23 int initSemSet(int semid,int which,int val);
 24 
 25 
 26 #endif //__COMM_H__    

函数文件

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

测试文件

 1 #include"comm.h"                                                                                                                                                                           
  2 
  3 int main ()
  4 {
  5 
  6 int semid= creatSemSet(1);
  7 initSemSet(semid,0,1);
  8 
  9  if(fork()==0)
 10  {
 11    //child
 12    int _semid= getSemSet(0);
 13    while(1)
 14    {
 15     P(_semid,0);
 16      printf("A");
 17      fflush(stdout);
 18      usleep(152677);
 19      printf("A ");
 20      fflush(stdout);
 21      usleep(112677);
 22     V(_semid,0);
 23    }
 24  }
 25  else
 26  {
 27    //father
 28      while(1)
 29      {
 30       P(semid,0) ;
 31      printf("B");
 32      fflush(stdout);
 33      usleep(152377);
 34      printf("B "); 
35      fflush(stdout);
 36      usleep(114677);
 37      V(semid,0);
 38      }
 39  }
 40 
 41   destroySemSet(semid);
 42  return 0;
 43 }        





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值