码迷,mamicode.com
首页 > 其他好文 > 详细

x信号量

时间:2016-04-14 18:12:01      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:进程通信


comm.h
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<sys/types.h>
  4 #include<sys/ipc.h>
  5 #include<sys/sem.h>
  6 #define _PATH_ "."
  7 #define _PROJ_ID_ 0x6666
  8 
  9 union semun
 10 {
 11     int val;
 12     struct semid_ds *buf;
 13     unsigned short  *array;
 14     struct seminfo  *__buf;
 15 };
 16 int creat_sem(int sem_nums);
 17 int get_sem(int sem_nums);
 18 int init_sem(int sem_id,int sem_num,int init_val);
 19 int p_sem(int sem_id,int sem_num);
 20 int v_sem(int sem_id,int sem_num);
 21 int distroy_sem(int sem_id);

comm.c
  1 #include"comm.h"
  2 
  3 int comm_creat_sem(int flags,int sem_nums)
  4 {
  5     key_t _key = ftok(_PATH_,_PROJ_ID_);
  6     if(_key == -1)
  7     {
  8         perror("ftok");
  9         return -1;
 10     }
 11     int sem_id = semget(_key,sem_nums,flags);
 12     if(sem_id==-1)
 13     {
 14         perror("semget");
 15         return -1;
 16     }
 17     return sem_id;
 18 }
 19 int creat_sem(int sem_nums)
 20 {
 21     int flags = IPC_CREAT|IPC_EXCL|0666;
 22     return comm_creat_sem(flags,sem_nums);
 23 }
 24 int get_sem(int sem_nums)
 25 {
 26     int flags = IPC_CREAT;
 27     return comm_creat_sem(flags,sem_nums);
 28 
 29 }
 30 int init_sem(int sem_id,int sem_num,int init_val)
 31 {
 32     union semun un;
 33     un.val = init_val;
 34     if(semctl(sem_id,sem_num,SETVAL,un,NULL)==-1)
 35     {
 36         perror("semctl");
 37         return -1;
 38     }
 39     return 0;
 40 }
 41 int op_sem(int sem_id,int sem_num,int op)
 42 {
 43     struct sembuf sem[1];
 44     sem[0].sem_num = sem_num;
 45     sem[0].sem_op = op;
 46     sem[0].sem_flg = 0;
 47     if(semop(sem_id,&sem[0],1)==-1)
 48     {
 49         perror("semop");
 50         return -1;
 51     }
 52     return 0;
 53 }
 54 int p_sem(int sem_id,int sem_num)
 55 {
 56     return op_sem(sem_id,sem_num,-1);
 57 }
 58 int v_sem(int sem_id,int sem_num)
 59 {
 60     return op_sem(sem_id,sem_num,1);
 61 }
 62 int distroy_sem(int sem_id)
 63 {
 64     if(semctl(sem_id,0,IPC_RMID,NULL)==-1)
 65     {
 66         perror("semctl");
 67         return -1;
 68     }
 69     return 0;
 70 }
 
 
 test.c
  1 #include"comm.h"
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 int main()
  5 {
  6     int sem_id = creat_sem(1);
  7     if(sem_id==-1)
  8     {
  9         return -1;
 10     }
 11     init_sem(sem_id,0,1);
 12     pid_t id = fork();
 13     if(id<0)
 14     {
 15         perror("fork");
 16         exit(1);
 17     }
 18     else if(id == 0)
 19     {
 20         int sem_id = get_sem(0);
 21         while(1)
 22         {
 23             p_sem(sem_id,0);
 24 
 25             printf("A");
 26             fflush(stdout);
 27             sleep(1);
 28             printf("A");
 29             fflush(stdout);
 30             sleep(1);
 31 
 32             v_sem(sem_id,0);
 33         }
 34     }
 35     else
 36     {
 37         while(1)
 38         {
 39             p_sem(sem_id,0);
 40 
 41             printf("B");
 42             fflush(stdout);
 43             sleep(1);
 44             printf("B");
 45             fflush(stdout);
 46             sleep(1);
 47 
 48             v_sem(sem_id,0);
 49         }
 50         waitpid(id,NULL,0);
 51         distroy_sem(sem_id);
 52 
 53     }
 54     return 0;
 55 }
 
 结果:
 [fbl@localhost sem]$ ./test
BABAABABAABBAABABAABABAABBAABABAABABAA^C
 [fbl@localhost sem]$ ./test
 BBAABBAABBAABBAABBA^C


x信号量

标签:进程通信

原文地址:http://fengbaoli.blog.51cto.com/10538178/1763822

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!