1.信号量的概念
作用:同步进程
概念:相当于某个资源(硬件资源或者软件资源),特殊的变量,只能取正数值
操作:
- p操作:减一,获取资源,阻塞
- v操作:加一,释放资源,从不会阻塞
- 对值的改变称为原子操作
- 0,1二值信号量
a.c
//同步
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include "sem.h"
int main()
{
sem_init();
int i = 0;
for(i=0;i<5;i++)
{
sem_p();
write(1,"A",1);//第一个一代表标准输出。第二个一代表一个字符
int n =rand()%3;
sleep(n);//睡眠一段时间,代表对打印机的使用有一段时间
write(1,"A",1);//使用结束
sem_v();//释放资源
n = rand()%3;
sleep(n);
}
sleep(10);
sem_destroy();//销毁
exit(0);
}
b.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include "sem.h"
int main()
{
sem_init();
int i = 0;
for(i=0;i<5;i++)
{
sem_p();
write(1,"B",1);//第一个一代表标准输出。第二个一代表一个字符
int n =rand()%3;
sleep(n);//睡眠一段时间,代表对打印机的使用有一段时间
write(1,"B",1);//使用结束
sem_v();//释放资源
n = rand()%3;
sleep(n);
}
exit(0);
}
sem.h
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
union semun
{
int val;
};
void sem_init();
void sem_p();
void sem_v();
void sem_destroy();
sem.c
#include "sem.h"
static int semid = -1;
void sem_init()
{
semid = semget((key_t)1234,1,IPC_CREAT|IPC_EXCL|0600);
if( semid == -1)
{
semid = semget((key_t)1234,1,0600);
if (semid == -1)
{
perror("semget error");
return;
}
}
else
{
union semun a;
a.val = 1;
if(semctl(semid,0,SETVAL,a) == -1)
{
perror("semctl error");
}
}
return;
}
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("semop p error");
}
}
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("semop p error");
}
}
void sem_destroy()
{
if(semctl(semid,0,IPC_RMID) == -1)
{
perror("semctl error");
}
}
结果:
注意:信号量创建一定要销毁。若没有销毁可以用以下方法销毁
- 代码中:key获取semid,就可以删除
- 命令:ipcrm -s semid
2.进程同步的概念
含义:对临界资源的访问有控制,达到同一时刻进程可以去访问。(临界资源、同步和互斥)
3.临界资源
含义:同一时刻只允许一个进程访问
4.临界区
含义:访问临界资源的代码段