作业: A, B 两个进程, 首先, A 进程获取用户输入, 当 A 进程获取的用户输入是“OK”时, B 进程输出 100 以内所有的素数。
分析:
可以利用信号量实现 A,B 进程的同步, 首先, B 进程阻塞在信号量的 P 操作(信号量初始值 == 0), 当 A 进程获取到“OK” 时, 对信号量进行 V 操作。
信号量:为了协调进程对资源的访问(即资源共享)
有两个进程A和B,A触发ok时B执行输出操作:
miana.c
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/sem.h>
#include <string.h>
#include <unistd.h>
void amin()
{
sem_get(); //获取或创建一个信号量
while(1)
{
printf("please input:");
char buff[128] = {0};
fgets(buff,127,stdin); //用户输入
if (strncmp(buff,"ok",2) == 0) //用户输入ok
{
sem_v(); //运行
}
if (strncmp(buff,"end",3) == 0) //用户输入end
{
sem_p(); //阻塞
}
}
}
mainb.c
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/sem.h>
#include <string.h>
#include <unistd.h>
void main()
{
sem_get();
sem_p(); //pv操作
printf("输出素数");
}
sem.h
union semun //联合体由sem.h(程序员)定义
{
int val;
};
void sem_get();
void sem_p();
void sem_v();
void sem_del();
sem.cpp
#include "sem.h"
void sem_get() //获取(创建)一个信号量,创建信号量时设置一个初值
{
semid = sem_get((key_t)1234,0,0664); //(0664操作权限)获取
if (semid == -1)
{
semid = sem_get((key_t)1234,1,0664 | IPC_CREAT); //创建
assert(semid != -1);
union semun sval;
sval.val = 0;
semctl(semid,0,SETVAL,sval);//标志号,编号,初始化,初始化的值
}
}
void sem_p() //阻塞操作
{
struct sembuf buf;
buf.sem_num = 0; //编号(操作目标的数组下标)
buf.sem_op = -1; //操作
buf.sem_flg = SEM_UNDO; //标志
semop(semid,&buf,1);//标识符,操作,信号量个数
}
void sem_v() //运行操作
{
struct sembuf buf;
buf.sem_num = 0;
buf.sem_op = 1;
buf.sem_flg = SEM_UNDO;
semop(semid,&buf,1);
//对semid这个信号量指定的变量进行操作,是选择发送(+1)还是等待(-1);
}
void sem_del()
{
semctl(semid,0,IPC_RMID); //删除信号量
}