进程间通信---信号量同步
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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!