进程间通讯(3)—信号量&管道

信号量:相当于资源计数器,涉及到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去删除

猜你喜欢

转载自blog.csdn.net/s_yj_q/article/details/78262422