【ARM&Linux】Linux信号量同步编程

2019-07-13 04:16发布

class="markdown_views prism-atelier-sulphurpool-light">

《Linux信号量同步编程笔记》


【代码】

/**************************************************************************************** * 文件名: producer.c * 创建者: * 时 间: * 联 系: * 简 介: 信号量同步编程,参考文档《unix环境高级编程》 *****************************************************************************************/ /*********************************************************** 问题引入: 生产者与消费者,消费者必须等待生产者工序全部完成,才能够拿货 ,生产者工序必须全部完成才能够通知消费者 生产者生产产品有如下工序: 1、生产 2、检测不良 4、售卖 消费者消费 【问题代码化】: 生产者: 1、生产者创建一个文件 2、写入文件->检测不良 休息 3、写入文件->可以售卖 消费者: 取走产品(可能在生产者休息的时候) 生产者释放信号量,初始值为0 消费者获取信号量 ************************************************************/ #include #include #include #include #include #include #include #include #define DEBUG_INFO(X) printf(X) 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 * 创建者: * 时 间: * 联 系: * 简 介: *****************************************************************************************/ #include #include #include #include #include #include #include #include #define DEBUG_INFO(X) printf(X) 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】

引用块内容

【结果】

这里写图片描述