进程间通信之分别用共享内存和信号量实现卖票

利用共享内存实现的卖票系统:
利用flag来保证同一时间只有一个程序使用内存,使用结束还原。

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <string.h>
#include <time.h>typedef struct _shm
{int flag;int ticket;
}SHM;void sellTicket(SHM* pshm)
{while (1){int time = rand() % 10 + 1; usleep(time*100000);if (pshm->flag == 1){pshm->flag = 0;if (pshm->ticket == 0)  // 票卖完{pshm->flag = 1;break;}printf ("卖掉一张票,座位号是 : %d\n", pshm->ticket);pshm->ticket--;pshm->flag = 1;}}
}int main(int argc, char **argv)
{srand ((unsigned int)time(NULL));// 1、创建或者获取一个共享内存int shmid = shmget((key_t)1234, sizeof(SHM), 0666 | IPC_CREAT);if (shmid == -1){perror ("shmget");return -1;}// 2、将共享内存映射到当前的进程空间SHM* pshm = (SHM*)shmat(shmid, NULL, 0);if(pshm == (SHM*)-1){perror ("shmat");return -1;}// 如果命令行参数等于2 负责对共享内存进行初始化if (argc == 2){pshm->flag   = 1;pshm->ticket = 100;}// 开始卖票sellTicket(pshm);// 如果命令行参数等于2 负责对共享内存进行删除if (argc == 2){shmctl(shmid, IPC_RMID, NULL);}return 0;
}

利用信号量实现:
头文件:

#ifndef __SEMAPHORE_H__
#define __SEMAPHORE_H__#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>union semun 
{int              val;    /* Value for SETVAL */struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */unsigned short  *array;  /* Array for GETALL, SETALL */struct seminfo  *__buf;  /* Buffer for IPC_INFO(Linux specific) */
};// 信号量的初始化函数
int sem_init(int sem_id)
{union semun sem;sem.val = 1;int ret = semctl(sem_id, 0, SETVAL, sem);return ret;
}// 信号量的 P 操作
int sem_p(int sem_id)
{struct sembuf sem;sem.sem_num = 0;sem.sem_op  = -1;sem.sem_flg = SEM_UNDO;int ret = semop(sem_id, &sem,1);return ret;
}// 信号量的 v 操作
int sem_v(int sem_id)
{struct sembuf sem;sem.sem_num = 0;sem.sem_op  = 1;sem.sem_flg = SEM_UNDO;int ret = semop(sem_id, &sem,1);return ret;
}// 销毁信号量
int sem_del(int sem_id)
{int ret = semctl(sem_id, 0, IPC_RMID);return ret;
}#endif // __SEMAPHORE_H__

主函数:

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <string.h>
#include <time.h>
#include "semaphore.h"typedef struct _shm
{int flag;int ticket;
}SHM;void sellTicket(SHM* pshm, int sem_id)
{while (1){int time = rand() % 10 + 1; usleep(time*100000);// 信号量的P操作sem_p (sem_id);if (pshm->ticket == 0)  // 票卖完{sem_v (sem_id);break;}printf ("卖掉一张票,座位号是 : %d\n", pshm->ticket);pshm->ticket--;sem_v (sem_id);}
}int main(int argc, char **argv)
{srand ((unsigned int)time(NULL));// 1、创建或者获取一个共享内存int shmid = shmget((key_t)1234, sizeof(SHM), 0666 | IPC_CREAT);if (shmid == -1){perror ("shmget");return -1;}// 创建一个信号量int sem_id = semget((key_t)5678, 1, 0666 | IPC_CREAT);if (sem_id== -1){perror ("semget");return -1;}   // 2、将共享内存映射到当前的进程空间SHM* pshm = (SHM*)shmat(shmid, NULL, 0);if(pshm == (SHM*)-1){perror ("shmat");return -1;}// 如果命令行参数等于2 负责对共享内存和信号量进行初始化if (argc == 2){pshm->ticket = 100;sem_init(sem_id);}// 开始卖票sellTicket(pshm, sem_id);// 如果命令行参数等于2 负责对共享内存和信号量进行删除if (argc == 2){shmctl(shmid, IPC_RMID, NULL);sem_del(sem_id);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shiro 的 @RequiresPermissions 注解使用

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 权限控制是shiro最核心的东西 Shiro权限声明通常是使用以冒号分隔的表达式。一个权限表达式可以清晰的指定资源类型&#xff0c;允许的…

【显卡天梯图】2014年最新显卡天梯图 – 【迄今最全系列显卡】

【显卡天梯图】2014年最新显卡天梯图 – 【迄今最全系列显卡】 随着电脑游戏的推广&#xff0c;很多用户都喜欢上了电脑网络游戏&#xff0c;所以组装电脑用户在装机的时候&#xff0c;会考虑电脑配置的游戏性能&#xff0c;要提高电脑配置游戏性能首要条件就是显卡性能要强&am…

原理系列:Spark1.x 生态圈一览

Spark生态圈&#xff0c;也就是BDAS&#xff08;伯克利数据分析栈&#xff09;&#xff0c;是伯克利APMLab实验室精心打造的&#xff0c;力图在算法&#xff08;Algorithms&#xff09;、机器&#xff08;Machines&#xff09;、人&#xff08;People&#xff09;之间通过大规模…

SpringMVC 注解 : @ModelAttribute

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 SpringMVC 注解 &#xff1a; ModelAttribute 的用法如上。 转自&#xff1a;https://blog.csdn.net/lovesomnus/article/details/78873…

网络编程项目(聊天室项目)

一、实现目标 一个在Linux下可以使用的聊天软件&#xff0c;要求至少实现如下功能&#xff1a; 1. 采用Client/Server架构 2. Client A 登陆聊天服务器前&#xff0c;需要注册自己的ID和密码 3. 注册成功后&#xff0c;Client A 就可以通过自己的ID和密码登陆聊天服务器 4…

CPU天梯图:2014年最新CPU性能天梯图

用户在组装电脑的前期需要考虑怎么选择适合自己的CPU&#xff0c;现在CPU性能强的比较贵&#xff0c;便宜的CPU性能又比较差&#xff0c;选择性价比高并且适合自己的处理器还真是比较花心思。在2014年的时候&#xff0c;最主流热门的AMD处理器是AMD A10-6800K&#xff0c;最新推…

解决: idea 修改 jsp 后,页面刷新无效

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 idea 修改 jsp 后浏览器访问无效。 解决&#xff1a;进入 idea 配置 修改部署方式&#xff1a; 修改 更新文件方式&#xff1a; OK了。

Python中的getpass模块

getpass模块用于输入密码时&#xff0c;隐藏密码字符 代码 import getpass name input("请输入你的名字&#xff1a;") passwd getpass.getpass("请输入你的密码&#xff1a;")print (name,passwd)   首先我们要import引入getpass模块&#xff0c;然后…

C++之命名空间

为什么要使用命名空间&#xff1f; 一个中大型软件往往由多名程序员共同开发&#xff0c;会使用大量的变量和函数&#xff0c;不可避免地会出现变量或函数的命名冲突。当所有人的代码都测试通过&#xff0c;没有问题时&#xff0c;将它们结合到一起就有可能会出现命名冲突。 …

如何做到每天写代码?

摘要&#xff1a;总有一大堆事情没有做完&#xff0c;没有时间和精力为业余项目写代码&#xff1f;不要着急&#xff0c;看看可汗学院计算机科学院院长John Resig怎么说。本文将教你如何保证在每天都能有时间给业余项目写代码。 你是否曾为业余项目没有进展而惆怅过&#xff1f…

Vue 实现前后端分离项目

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Vue实现前后端分离项目的初体验 经过之前学习的Vue的知识&#xff1a; vue基本指令vue组件vue-resourcevue路由 其实我们已经可以开始…

C++对C的一些加强和变化

实用性加强&#xff1a; int main() {// C语言中的变量都必须在作用域开始的位置定义&#xff01;&#xff01;// C中更强调语言的“实用性”&#xff0c;所有的变量都可以在需要使用时再定义。for (int i 0; i < 10; i){std::cout << i << std::endl;}return…

优秀Unix管理员的七个习惯

摘要&#xff1a;Unix系统管理员可能会很懒或喜欢优雅的解决方法&#xff0c;这就是他们的存在之美。一位优秀的Unix系统管理员有着自己的习惯&#xff1a;不会等到问题来找你、精通所使用的工具和系统、确定事情优先次序和喜欢优雅的解决方案但不迷失等。 优秀的Unix系统管理员…

Vue.js 极简小例:读值、样式调用、if判断、a 标签、点击事件、管道

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 写法&#xff1a; <template><div id"app"><!-- 三目运算符使用 ‘ok’ 的值定义在 data 中-->{{ ok …

【快写】基本思路及模板

快读也可以了解一下 先从C自带的输出开始吧 cout<<n<<endl;这是最基本的输出&#xff0c;适合初学者 &#xff08;虽然我到现在都还在用&#xff09; 然后稍微快一点的输出 printf("%d",n);这个就比较快速了&#xff0c;但是对于那种毒瘤题目 故意卡你的…

C++与C中const的比较以及const和define的比较

C与C中const的比较&#xff1a; C语言中 const修饰的变量是一个 常变量&#xff0c;本质还是变量&#xff0c;有自己的地址空间C编译器对const常量的处理 当碰见常量声明时&#xff0c;在符号表中放入常量 > 问题&#xff1a;那又如何解释取地址编译过程中若发现对const使…

中国古典十大悲剧

一.《窦娥冤》  《窦娥冤》——元关汉卿 山阴书生窦天章因无力偿还蔡婆的高利贷&#xff0c;把七岁的女儿窦娥送给蔡婆当童养媳来抵债。窦娥长大后与蔡婆儿子成婚&#xff0c;婚后两年蔡子病死。后来蔡婆向赛卢医索债&#xff0c;被赛卢医骗至郊外谋害&#xff0c;为流氓张驴…

解决: Elements in iteration expect to have ‘v-bind:key‘ directives

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 报错&#xff1a; Elements in iteration expect to have v-bind:key directives 原本写法&#xff1a; <li v-for"site in s…

回来太多事需要处理

出差回来&#xff0c;发现太多事需要处理现在每个项目都在Delay。且没有一个人是主动汇报项目的。这是非常不正常的现象。感觉有点累转载于:https://www.cnblogs.com/boriscao/archive/2005/09/03/229368.html

不该失去的,一块钱也不放弃

很多人都觉得&#xff0c;有钱人既然财力雄厚&#xff0c;花钱时必定毫不手软。然而&#xff0c;观察成功的CEO&#xff0c;你会发现&#xff0c;他们多数人花钱也花得小心&#xff0c;对于什么该花、值得花&#xff0c;算得十分精细。 华人首富、香港长江实业与和记黄埔董事局…