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

2023-12-27 19:53:37

进程同步的概念

请添加图片描述

生产者/消费者问题引入

请添加图片描述

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^[

文章来源:https://blog.csdn.net/QQ1402369668/article/details/135244509
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。