进程间通信---信号量同步

进程同步的概念

请添加图片描述

生产者/消费者问题引入

请添加图片描述

a生产的产品有多道工序,a还没有生产完 产品,产品就被b拿走了。

将此问题代码化

代码设计:

请添加图片描述
生产者代码 producer.c

#include<sys/types.h>
#include<sys/stat.h>

#include<fcntl.h>
#include<unistd.h>

void main(){
        int fd;
        //创建产品文件
        fd = open("./product.txt", O_RDWR|O_CREAT,0755);
        //休息
        sleep(20);
        //向产品文件里面填充内容
        write(fd,"the product is finished.",30);

        close(fd);
}
~       

消费者代码 custom.c

#include<stdlib.h>
void main(){
        //取走产品文件
        system("cp ./product.txt ./ship/");
}
~                                                                                                                                   
~                                                                                                                                   
~       

运行结果:
ship/product.txt中的内容为空的。

程序加入 信号量 同步控制 代码

代码设计:

请添加图片描述
关键:同步和 上节课互斥 的区别在于,同步时,信号量的初始值为0,生产者只释放信号量,消费者只获取信号量。
【补充一下:为什么上节课互斥的做法不能同步哪?信号量的初始值为1,如果a进程先执行是可以的,但是如果b进程先执行就不行了】

注意:消费者最后不用释放信号了。

生产者producer.c


#include<sys/stat.h>
#include<sys/sem.h>
#include<fcntl.h>
#include<unistd.h>

void main(){
        int fd;
        key_t key;
        int semid;
        struct sembuf sops;

        key = ftok("/root",2);

        //创建信号量集合
        semid = semget(key,1,IPC_CREAT);
        semctl(semid,0,SETVAL,0);


        //创建产品文件
        fd = open("./product.txt", O_RDWR|O_CREAT,0755);
        //休息
        sleep(20);
        //向产品文件里面填充内容
        write(fd,"the product is finished.",30);

        close(fd);

        //释放信号量
        sops.sem_num = 0;
        sops.sem_op = 1;
        sops.sem_flg = SEM_UNDO;//注意:一般都要加上SEM_UNDO,意思是,当程序运行出现错误时,系统会帮你“解决”这个信号量。 “解决”是我z自己想的
        semop(semid,&sops,1);

}
                                                                                                                  36,1         底端

消费者comstom.c

#include<stdlib.h>
#include<sys/sem.h>
void main(){
        key_t key;
        int semid;
        struct sembuf sops;
        int ret;

        key = ftok("/root",2);
        semid = semget(key,1,IPC_CREAT);

        //获取信号量
        sops.sem_num = 0;
        sops.sem_op = -1;
        sops.sem_flg = SEM_UNDO;
        semop(semid,&sops,1);

        //取走产品文件
        system("cp ./product.txt ./ship/");
}
~                    

运行结果:

the product is finished.^@^@^@^@^A^[
  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值