练习:
A, B 两个进程,首先,A 进程获取用户输入,当 A 进程获取的用户输入是“OK”
时, B 进程输出 100 以内所有的素数。
sem.h:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<string.h>
#include<sys/sem.h>
union semun
{
int val;
}
void sem_get()
{
semid = semget((key_t)1234,0,0666);
if(semid == -1)
{
semid=semget((key_t)1234,1,0666| IC_CREAT);
if(semid == -1)
{
exit(0);
}
union semun v;
v.val = 0;
semctl(semid,0,SETVAL,v);
}
}
void sem_p()
{
struct sembuf op;
op.sem_num = 0; //要操作的信号量编号
op.sem_op = -1;
op.sem_flg = SEM_UNDO;
semop(semid,&op,1);
}
void sem_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); //用于删除一个已经无需继续使用的信号量
}
A进程:
void main()
{
sem_get();
while(1)
{
printf("please input:");
char p[128]={0};
fgets(p,127,stdin);
if (strncmp (p,"ok",2) == 0)
{
sem_v();
}
if(strncmp(p,"end",3)== 0)
{
break;
}
}
printf("write success\n");
}
B进程:
#include"sem.h"
#include<sys/sem.h>
void main()
{
sem_get();
sem_p();
int i=2;
for(;i<=100;i++)
{
int j=1;
int count =0;
for(;j<=i;j++)
{
if(i%j == 0 )
{
count ++;
}
}
if(count == 2)
{
printf("%d ",i);
}
}
printf("\n");
}