1.实验 Linux 下创建子进程及资源共享的方法 2. 编写一个程序,使用 Linux 中的 IPC 机制,利用多个进程实现“石头、剪子、布”的 游戏
时间: 2024-10-13 17:02:08 浏览: 36
ipc.zip_ipc 进程通信
1. 在Linux下创建子进程并共享资源通常有以下几种方法:
- fork()和exec()系统调用:`fork()`用于创建新的子进程,而`exec()`系列函数(如`execv()`, `execvp()`, `execle()`等)可以替换新进程中父进程的进程上下文,使得子进程可以运行指定的程序,并继承父进程的部分资源,比如环境变量。
- 使用共享内存(shm):通过`shm_open()`, `shm_unlink()`, 和`mmap()`等函数,可以在多个进程间建立直接的、高性能的数据交换区域。
- 消息队列(msg_queue):`mq_open()`, `mq_send()`, 和`mq_recv()`等API允许进程之间传递数据,虽然不是实时共享,但提供了异步通信的方式。
- 共享文件(semaphores):`sem_init()`, `sem_wait()`, 和`sem_post()`等用于控制对共享资源的访问。
2. 创建一个使用Linux IPC机制实现石头剪刀布游戏的基本步骤如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#define SHM_KEY (54321) // 共享内存标识符
#define MSG_BUF_SIZE 10
int game(int player_move, int* ai_move);
void *start_game_server(int *player_score) {
int* ai_score = malloc(sizeof(int));
int move;
while (1) {
move = read(sockfd, &move, sizeof(move)); // 接收玩家输入
if (game(move, ai_score)) {
atomic_fetch_add(player_score, 1);
} else {
atomic_fetch_add(ai_score, 1);
}
}
}
int start_game_client(int client_sock) {
int player_score = 0;
int ai_score = 0;
char shared_msg[MSG_BUF_SIZE];
while (1) {
game(rock Paper Scissors, &ai_score); // 调用AI算法
snprintf(shared_msg, MSG_BUF_SIZE, "Player Score: %d AI Score: %d", player_score, ai_score);
write(client_sock, shared_msg, strlen(shared_msg));
}
return 0;
}
// 简化的石头剪刀布游戏实现,忽略AI算法...
int game(int player_move, int* ai_move) {
... // 实现游戏逻辑,这里省略
}
int main(int argc, char *argv[]) {
int server_sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr;
// 初始化服务器地址...
int shm_id = shmget(SHM_KEY, MSG_BUF_SIZE, IPC_CREAT | 0666);
char *shared_memory = shmat(shm_id, NULL, 0); // 分配并映射到进程空间
pid_t server_pid = fork();
if (server_pid == 0) {
server_pid = start_game_server(&*(int*)shared_memory);
} else {
close(server_sock); // 主进程关闭套接字
int client_sock = accept(sockfd, NULL, NULL);
start_game_client(client_sock);
}
return 0;
}
```
这个例子中,主进程启动了一个子进程作为游戏服务器,接收玩家输入并在共享内存中更新分数。客户端进程则从共享内存读取得分并显示给用户。请注意,这只是一个简化版本,实际的AI算法和游戏逻辑需要根据具体需求编写。
阅读全文