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

来源:互联网 发布:团队协作工具知乎 编辑:程序博客网 时间:2024/06/07 06:20

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

原创粉丝点击