日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进程间通信之分别用共享内存和信号量实现卖票 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

利用共享內存實現的賣票系統:
利用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; }

總結

以上是生活随笔為你收集整理的进程间通信之分别用共享内存和信号量实现卖票的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。