信号量使用介绍

  1 #include <unistd.h>
  2 #include<stdio.h>
  3 #include <sys/sem.h>
  4 
  5 //       int semget(key_t key, int nsems, int semflg);
  6 //       int semop(int semid, struct sembuf *sops, size_t nsops);
  7 //       int semctl(int semid, int semnum, int cmd, ...);
  8 union semun {
  9                int              val;    /* Value for SETVAL */
 10                struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
 11                unsigned short  *array;  /* Array for GETALL, SETALL */
 12                struct seminfo  *__buf;  /* Buffer for IPC_INFO
 13                                            (Linux-specific) */
 14 };
 15 
 16 void pGetKey(int semid)
 17 {
 18         struct sembuf sops;
 19         sops.sem_num = 0;
 20         sops.sem_op  = -1;
 21         sops.sem_flg = SEM_UNDO;
 22 
 23         semop(semid,&sops,1);
 24         printf("get key\n");
 25 }
 26 void vPutKey(int semid)
 27 {
 28         struct sembuf sops;
 29         sops.sem_num = 0;
 30         sops.sem_op  = 1;
 31         sops.sem_flg = SEM_UNDO;
 32 
 33         semop(semid,&sops,1);
 34         printf("put back key\n");
 35 }
 36 
 37 int main()
 38 {
 39         int semid;
 40         key_t key;
 41         key = ftok(".",3);
 42         semid = semget(key,1,IPC_CREAT|0600);
 43 
 44         union semun temp;
 45         temp.val = 0;
 46         semctl(semid,0,SETVAL,&temp);
 47 
 48         pid_t pid;
 49         pid=fork();
 50 
 51         if(pid>0){
 52                 pGetKey(semid);
 53                 printf("this is father\n");
 54                 vPutKey(semid);
 55                 semctl(semid,0,IPC_RMID);
 56         }else if(pid==0){
 57                 printf("this is child\n");
 58                 vPutKey(semid);
 59         }
 60 
 61         return 0;
 62 }
~                                                                                                                                                                                                                                                                                                                                                                                                                       
~                                                                                                                                                                                                                                                                                                                                                                                                                       
~                                        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值