进程间通信之分别用共享内存和信号量实现卖票
来源:互联网 发布:c语言中n的阶乘 编辑:程序博客网 时间:2024/05/21 06:39
利用共享内存实现的卖票系统:
利用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;}
阅读全文
1 0
- 进程间通信之分别用共享内存和信号量实现卖票
- 通过共享内存和信号量实现进程间的通信
- 使用信号量和共享内存实现进程间通信
- 用共享内存和信号量实现的简单的卖票系统
- 进程通信之共享内存与信号量
- 进程通信之信号量限制共享内存
- linux进程通信之信号量、共享内存
- 多进程编程之进程间通信-共享内存,信号量和套接字
- Linux进程间通信之共享内存+信号量
- 进程间通信--信号量+共享内存
- 进程间通信--信号量+共享内存
- Linux--进程间通信-共享内存-信号量
- 进程间通信—共享内存、信号量
- Linux进程间通信之信号量(semaphore)、消息队列(Message Queue)和共享内存(Share Memory)
- 进程通信--信号量,共享内存
- 进程间通信:用信号量实现对共享内存读写顺序的控制
- 进程间通信:用信号量实现对共享内存读写顺序的控制
- Linux进程间通信之信号量(semaphore)、消息队列(Message Queue)和共享内存(Share Memory) System V 进程通信方式:信号量(semaphore)、消息队列
- LeetCode 202. Happy Number
- javascript------Bootstrap框架
- Android 从源码的角度带你完全解析AsyncTask
- Linux下视频流媒体服务器搭建详解
- 详解c++中类的六个默认的成员函数
- 进程间通信之分别用共享内存和信号量实现卖票
- 最短路径问题Dijkstra算法学习
- 微信支付H5支付申请
- Spring boot websocket简单例子
- EasyStream系列5之本地视频转rtsp
- 一个蛋疼的功能,监听android系统媒体库的变动
- react-native-splash-screen 不支持 react-native 0.47.1
- 矩阵中的路径
- muduo源码学习(9)-单例类