上节课对信号量的相关函数semget() semctl() semop()做了了解(换不是很理解)这里用一个小例子来运用这三个函数进一步对信号量进行了解
目标实现:AB 进程使用同一信号量,
初始化型号量为0,
————-> B进程先进行p操作,
当用户输入OK时,
进行v操作, ———– > B进程输出1~100素数
PV操作相当一个计数器,将系统资源与当前资源做对比,当 系统资源大于等于我所需要的资源 ,我的进程就可以运行,如果不满足就堵塞, (比如说,你来的时候,资源数为1,而你恰好需要一个资源,那此时你得到了该资源,然后资源数变为1,我来的时候,资源数就是0了,但是我需要1个资源,资源不足,那我就会阻塞,直到信号量的值大于等于我需要的资源数,我才会被唤醒)
信号量的创建和相关操作的封装
void sem_get()//创建信号量集
{
semid = semget((key_t)1234, 1, 0664);
if(semid == -1)
{
semid = semget((key_t)1234, 1, 0664 | IPC_CREAT);
assert(semid != -1);
union semun v;
v.val = 0;
semctl(semid, 1, SETVAL, v);
}
}
void sem_p()//p操作
{
struct sembuf op;
op.sem_num = 0;
op.sem_op = -1;
op.sem_flg = SEM_UNDO;
semop(semid, &op, 1);
}
void sem_v()//v操作
{
struct sembuf op;
op.sem_num = 0;
op.sem_op = 1;
op.sem_flg = SEM_UNDO;
semop(semid, &op, 1);
}
void sem_del()//删除信号
{
semctl(semid, 0, IPC_RMID, NULL);
}
A进程
void main()
{
sem_get(1234);
printf("A start\n");
char ar[100]={0};
while(1)
{
printf("input:");fflush(stdout);
fgets(ar,100,stdin);
if(strncmp(ar,"OK",2)==NULL)
{
sem_v();
}
if(strncmp(ar,"end",3)==NULL)
{
exit(0);
}
}
}
B进程
void main()
{
sem_get(1234);
printf("B start\n");
sem_p();
int i=1;
for(;i<100;++i)
{
int j=2;
for(;j<i;++j)
{
if(i%j==0)break;
}
if(i==j || i==1)
printf("%d ",i);
}
printf("\n");
}