临界资源:同一时刻只允许一个进程访问的资源
临界区:访问临界资源的代码段
原子性:做一定会做完不会被打断
同步:控制同一时刻只能有一个访问资源 不会导致异常
信号量:特殊的变量 一般取正数 二值信号量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行操作阻塞