使用Linux中的IPC机制,完成 “石头、剪子、布”的游戏。其中选手1和选手2使用rand()函数来生成随机数,创建3个进程
时间: 2024-03-05 21:49:19 浏览: 144
好的,首先需要了解一下IPC机制。在Linux中,IPC机制主要有三种,包括管道、共享内存和消息队列。对于这个游戏来说,我们可以使用消息队列来实现进程之间的通信。
接下来,我们需要创建三个进程,分别是选手1、选手2和裁判。选手1和选手2使用rand()函数生成随机数,然后将结果发送到消息队列中,裁判从消息队列中接收到两个选手的结果后进行比较,输出比赛结果。
下面是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <time.h>
#define MSG_KEY 1234
#define MSG_TYPE 1
struct message {
long type;
int data;
};
int main() {
srand(time(NULL));
// 创建消息队列
int msgid = msgget(MSG_KEY, IPC_CREAT|0666);
if (msgid < 0) {
perror("msgget");
exit(1);
}
// 创建选手1进程
pid_t pid1 = fork();
if (pid1 < 0) {
perror("fork");
exit(1);
} else if (pid1 == 0) {
// 子进程中作为选手1
while (1) {
// 生成随机数
int num = rand() % 3 + 1;
// 发送消息到消息队列中
struct message msg;
msg.type = MSG_TYPE;
msg.data = num;
if (msgsnd(msgid, &msg, sizeof(msg.data), 0) < 0) {
perror("msgsnd");
exit(1);
}
// 等待裁判的结果
sleep(1);
}
}
// 创建选手2进程
pid_t pid2 = fork();
if (pid2 < 0) {
perror("fork");
exit(1);
} else if (pid2 == 0) {
// 子进程中作为选手2
while (1) {
// 生成随机数
int num = rand() % 3 + 1;
// 发送消息到消息队列中
struct message msg;
msg.type = MSG_TYPE;
msg.data = num;
if (msgsnd(msgid, &msg, sizeof(msg.data), 0) < 0) {
perror("msgsnd");
exit(1);
}
// 等待裁判的结果
sleep(1);
}
}
// 裁判进程
while (1) {
// 接收选手1的结果
struct message msg1;
if (msgrcv(msgid, &msg1, sizeof(msg1.data), MSG_TYPE, 0) < 0) {
perror("msgrcv");
exit(1);
}
// 接收选手2的结果
struct message msg2;
if (msgrcv(msgid, &msg2, sizeof(msg2.data), MSG_TYPE, 0) < 0) {
perror("msgrcv");
exit(1);
}
// 比较选手1和选手2的结果
if (msg1.data == msg2.data) {
printf("平局\n");
} else if (msg1.data == 1 && msg2.data == 2 ||
msg1.data == 2 && msg2.data == 3 ||
msg1.data == 3 && msg2.data == 1) {
printf("选手1获胜\n");
} else {
printf("选手2获胜\n");
}
}
return 0;
}
```
在这个示例代码中,我们首先使用msgget()函数创建了一个消息队列,然后使用fork()函数创建了三个进程,分别是选手1、选手2和裁判。选手1和选手2在子进程中生成随机数,并将结果发送到消息队列中。裁判在父进程中接收到两个选手的结果后进行比较,输出比赛结果。
需要注意的是,在使用消息队列时要注意消息类型,这里我们定义了一个消息类型为1的消息。另外,在发送和接收消息时,要使用msgsnd()和msgrcv()函数,并传入正确的参数。
希望这个示例代码能够帮助到你。
阅读全文