进程间通讯的方式 信号量

临界资源:同一时刻只允许一个进程访问的资源
临界区:访问临界资源的代码段
原子性:做一定会做完不会被打断
同步:控制同一时刻只能有一个访问资源 不会导致异常
信号量:特殊的变量 一般取正数 二值信号量0/1 计数信号量:3
pv操作:p原子-1 值为0时 获取资源 p操作阻塞
v原子+1 代表释放资源

i++ :非原子指令 汇编需要执行多步
ipcs-s查看信号量
ipcrm-s id 删除信号量

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<string.h>
  4 #include<stdlib.h>
  5 #include<sys/sem.h>
  6 
  7 union semun
  8 {
  9     int val;
 10 };
 11 void sem_init();
 12 //阻塞 原子操作
 13 void sem_p();
 14 void sem_v();
 15 void sem_destroy();


  1 #include"sem.h"
  2 
  3 static int semid = -1;
  4 
  5 
  6 void sem_init()
  7 {
  8     //信号量
  9     semid = semget((key_t)1234,1,IPC_CREAT|IPC_EXCL|0600);
 10 
 11     if(semid == -1)
 12     {
 13         semid = semget((key_t)1234,1,0600);
 14         if(semid == -1)
 15         {
 16             perror("error");
 17             return ;
 18         }
 19     }
 20     else
 21     {
 22         union semun a;
 23         a.val = 1;
 24 
 25         if(semctl(semid,0,SETVAL,a) == -1)
 26         {
 27             perror("error2");
 28         }
 29     }
 30 }
 31 //阻塞 原子操作
 32 void sem_p()
 33 {
 34     struct sembuf buf;
 35     buf.sem_num = 0;
 36     buf.sem_op = -1;
 37     buf.sem_flag = SEM_UNDO;
 38 
 39     if(semop(semid,&buf,1)== -1)
 40     {
 41         perror("semop p error");
 42     }
 43 
 44 }
 45 void sem_v()
 46 {
 47 
 48     struct sembuf buf;
 49     buf.sem_num = 0;
 50     buf.sem_op = 1;
 51     buf.sem_flag = SEM_UNDO;
 52 
 53     if(semop(semid,&buf,1)== -1)
 54     {
 55         perror("semop p error");
 56     }
 57 
 58 }
 59 void sem_destroy()
 60 {
 61     if(semctl(semid,0,IPC_RMID)== -1)
 62     {
 63         perror("semctl error del");
 64     }
 65 }
 66 
 67 
                                                                                                                                                                                                              


AB通信


s1 1
s2 0 

ps1							ps2 
write		-		----->	read
vs2							vs1

在p行操作阻塞
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值