class="markdown_views prism-atelier-sulphurpool-light">
《Linux信号量同步编程笔记》
【代码】
/****************************************************************************************
* 文件名: producer.c
* 创建者:
* 时 间:
* 联 系:
* 简 介: 信号量同步编程,参考文档《unix环境高级编程》
*****************************************************************************************/
/***********************************************************
问题引入: 生产者与消费者,消费者必须等待生产者工序全部完成,才能够拿货
,生产者工序必须全部完成才能够通知消费者
生产者生产产品有如下工序: 1、生产
2、检测不良
4、售卖
消费者消费
【问题代码化】:
生产者:
1、生产者创建一个文件
2、写入文件->检测不良
休息
3、写入文件->可以售卖
消费者:
取走产品(可能在生产者休息的时候)
生产者释放信号量,初始值为0
消费者获取信号量
************************************************************/
const char* const p_str = "正在成产...
";
const char* const p_str2 = "生产完成
";
int main()
{
int semid;
int fd;
struct sembuf sops;
key_t key;
//--- 判断文件是否存在 ---//
if(access("./tmp.txt", 0) != 0) /***/
{
printf("exisits!
");
//--- 创建产品 ---//
if((fd=open("./tmp.txt", O_CREAT|O_RDWR, 0666)) < 0)
{
DEBUG_INFO("producer creat err
");
exit(1);
}
}
//--- 创建信号量 ---//
key = ftok("/bin", 1);
semid = semget(key, 1, IPC_CREAT);
if((semctl(semid, 0, GETVAL)) != 0)
{
semctl(semid, 0, SETVAL, 0);
}
//--- 生产产品 ---//
if((write(fd, p_str, strlen(p_str))) < 0)
{
DEBUG_INFO("producer product err
");
}
sleep(5);
//--- 生产产品完成 ---//
if((write(fd, p_str2, strlen(p_str2))) < 0)
{
DEBUG_INFO("producer product finished
");
}
//--- 释放信号量 ---//
sops.sem_flg = SEM_UNDO;
sops.sem_num = 0;
sops.sem_op = 1;
semop(semid, &sops, 1);
//--- 关闭文件 ---//
close(fd);
return 0;
}
/****************************************************************************************
* 文件名: consunmers.c
* 创建者:
* 时 间:
* 联 系:
* 简 介:
*****************************************************************************************/
int main()
{
key_t key;
int semid;
struct sembuf sops;
//--- 打开信号量 ---//
key = ftok("/bin", 1);
semid = semget(key, 1, IPC_CREAT);
//--- 获取信号量 ---//
sops.sem_flg = SEM_UNDO;
sops.sem_num = 0;
sops.sem_op = -1;
semop(semid, &sops, 1);
system("cat ./tmp.txt");
return 0;
}
【Makefile】
【结果】