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进程先执行就不行了】
注意:消费者最后不用释放信号了。
#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 底端
#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^[