进程间通信之分别用共享内存和信号量实现卖票
生活随笔
收集整理的這篇文章主要介紹了
进程间通信之分别用共享内存和信号量实现卖票
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
利用共享內存實現的賣票系統:
利用flag來保證同一時間只有一個程序使用內存,使用結束還原。
利用信號量實現:
頭文件:
主函數:
#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; }總結
以上是生活随笔為你收集整理的进程间通信之分别用共享内存和信号量实现卖票的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络安全06_安装Windows XP_
- 下一篇: 网络安全07-Wireshark下载安装