使用Linux中的IPC机制,完成 “石头、剪子、布”的游戏。使能够人机进行游戏
时间: 2024-12-02 14:19:25 浏览: 28
在Linux中,可以使用多种 Inter-Process Communication (IPC) 机制来创建一个"石头、剪刀、布"的游戏,让计算机(即程序)与用户(通过终端)交互。以下是使用管道(pipe)、消息队列(message queue)或共享内存的一个简单示例,这里以共享内存为例:
1. **共享内存**:
- 首先,创建一个包含玩家选择(如整数0-2代表石头、剪刀、布)的全局变量或结构体,在两个进程间共享。
```c
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
typedef struct GameState {
int playerChoice;
} GameState;
// 初始化共享内存
int shmKey = ftok("./stones-paper-scissors", 'S'); // 创建键值
GameState gameState;
int shmid = shmget(shmKey, sizeof(GameState), SHM_RDONLY | IPC_CREAT);
if (shmid < 0) {
perror("Error creating shared memory");
exit(1);
}
gameState.playerChoice = 0; // 设置初始状态
shmat(shmid, &gameState, 0); // 连接到共享内存
```
- 程序A(接收用户输入)会读取并更新这个值,而程序B(电脑随机选择)则负责设置游戏状态。
```c
void userGamePlay() {
scanf("%d", &gameState.playerChoice);
// 更新并同步到共享内存
shmdt(&gameState); // 退出共享内存
sem_post(ipc_sem); // 提醒另一个进程更新了
}
void computerGamePlay() {
srand(time(NULL));
gameState.playerChoice = rand() % 3 + 1;
shmat(shmid, &gameState, 0); // 写入新的游戏状态
shmdt(&gameState);
sem_post(ipc_sem); // 提醒用户进程更新了
}
```
2. **信号量(semaphores)**: 使用信号量同步两个进程,确保不会同时修改共享内存。
```c
sem_t ipc_sem; // 初始化一个信号量
sem_init(&ipc_sem, 0, 1); // 设置初始计数值为1,表示没有等待进程
```
在`userGamePlay()`和`computerGamePlay()`函数最后都调用`sem_post(ipc_sem)`,表示已完成操作。
阅读全文