信号量:相当于资源计数器,涉及到PV操作,用于进程间的同步,当进程
管道:(这里指有名管道)顾名思义,连接两个进程的通道,相当于进程之间的共享通道,进程可以在这里“存”东西,也可以“取”东西,但是取东西的前提是管道中有东西,就是说,当一个进程想打开一个空的管道文件时进程就会堵塞。
例子:初始信号量为0,
B进程p操作堵塞
A进程:用户输入OK时 V操作——> B进程输出:我准备好了,打开
管道文件 ,但是这时并没有读写操
作,B进程堵塞
用户输入sq时,在管
道文件中写入数据———–>B进程继续运行输出1~100素数
//A进程
void main()
{
sem_get(1234);//A、B进程控制同一个信号量
printf("A进程开始:\n");
while(1)
{
printf("please input:\n");
char buff[128]={0};
fgets(buff,128,stdin);
buff[strlen(buff)-1]=0;
if(strncmp(buff,"ok",2)==0)
{
sem_v();
}
else if(strncmp(buff,"sq",4)==0)
{
int fd=open("FIFO",O_WRONLY);
assert(fd!=-1);
write(fd,"begin",5);
}
}
}
//B进程
void main()
{
sem_get(1234);
printf("B进程开始:\n");
while(1)
{
sem_p();//资源为0 阻塞等待A进程中的v操作的执行
printf("我准备好了\n");
int fd=open("FIFO",O_RDONLY);//管道阻塞
assert(fd!=-1);
char buff[128]={0};
read(fd,buff,127);
if(strncmp(buff,"begin",5)==0)//判断从管道中读取的数据是否为“begin”
{
printf("我开始计算100以内素数\n");
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);
}
}
}
}
}
注意问题:在调试程序时,要及时删除进程中的信号量,一面对下次测试造成影响,由此也可看出信号量集的释放与函数体的结束没有关系,要用sem_del去删除