信号量有关函数的封装

来源:互联网 发布:非农数据对原油的影响 编辑:程序博客网 时间:2024/05/23 19:13

基于上一篇《信号量通信》,完成有关函数的封装。

sem.h

  #ifndef _SEM_H  #define _SEM_H    #include<stdio.h>  #include<stdlib.h>  #include<unistd.h>  #include<string.h>  #include<assert.h>  #include<sys/types.h>  #include<sys/ipc.h>  #include<sys/sem.h>    int semid;    union semun  {      int val;  };    void sem_get();//获取或创建,如果是创建初始化  void sem_p();//p操作  void sem_v();//v操作  void sem_del();//删除    #endif
sem.c

#include"sem.h"  void sem_get()  {     semid = semget((key_t)512,1,0664);//直接获取      if(semid == -1)//如果获取不到则创建     {         semget((key_t)512,1,0664|IPC_CREAT);         assert(semid != -1);           union semun v;         v.val = 0;            if(semctl(semid,0,SETVAL,v) == -1)//初始化         {              perror("semctl error\n");              exit(0);          }      }  }  void sem_p()  {      struct sembuf buf;      buf.sem_num = 0;      buf.sem_op = -1;      buf.sem_flg = SEM_UNDO;        if(semop(semid,&buf,1) == -1)      {          perror("p error\n");          exit(0);      }  }    void sem_v()  {      struct sembuf buf;      buf.sem_num = 0;      buf.sem_op = 1;      buf.sem_flg = SEM_UNDO;        if(semop(semid,&buf,1) == -1)      {          perror("v error\n");          exit(0);      }  }   void sem_del()  {      if(semctl(semid,0,IPC_RMID) == -1)      {          perror("del error\n");          exit(0);      }  }

利用信号量完成A进程获取用户输入,输入“ok”后,B进程输出100以内的素数。

testa.c

   #include"sem.h"      int main()   {       sem_get();          while(1)       {           printf("please input:");          fflush(stdout);            char buff[128] = {0};          fgets(buff,128,stdin);          buff[strlen(buff)-1] = 0;            if(strncmp(buff,"ok",2) == 0)          {              sem_v();              exit(0);          }      }  }     


testb.c

   #include"sem.h"      int Isprimer(int n)   {       int i = 2;       for(;i<n;i++)       {           if(n%i == 0)           {              return 0;          }      }      return 1;  }  int main()  {      sem_get();      sem_p();        int i;      for(i=0;i<=100;i++)      {          if(Isprimer(i))         {              printf("%d is primer\n",i);          }      }        sem_del();  }

结果如下:


原创粉丝点击