话不多说,直接来吧。
问题一:分析下面代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 64
int main() {
// 创建共享内存
key_t key = ftok("/tmp", 'S');
int shm_id = shmget(key, SHM_SIZE, IPC_CREAT | 0666);
if (shm_id == -1) {
perror("shmget");
exit(EXIT_FAILURE);
}
// 连接共享内存
char *shared_memory = shmat(shm_id, NULL, 0);
if (shared_memory == (char *)(-1)) {
perror("shmat");
exit(EXIT_FAILURE);
}
// 使用 fork 创建子进程
pid_t child_pid = fork();
if (child_pid < 0) {
// fork 失败
perror("Fork failed");
exit(EXIT_FAILURE);
}
if (child_pid != 0) {
// 父进程
printf("Parent process (PID: %d) writes to shared memory\n", getpid());
sprintf(shared_memory, "Hello from parent!");
wait(NULL); // 等待子进程结束
} else {
// 子进程
printf("Child process (PID: %d) reads from shared memory\n", getpid());
printf("Message from parent: %s\n", shared_memory);
}
// 分离共享内存
shmdt(shared_memory);
// 删除共享内存
shmctl(shm_id, IPC_RMID, NULL);
return 0;
}
这段代码演示了在Linux环境下使用共享内存进行进程间通信的基本概念。以下是代码的主要功能和步骤:
-
创建共享内存:
- 使用
ftok
函数创建一个用于共享内存的键值(key),这个键值通常基于一个文件路径和一个字符。 - 使用
shmget
函数创建共享内存段,返回一个共享内存标识符(shm_id)。
- 使用
-
连接共享内存:
- 使用
shmat
函数将共享内存段连接到进程的地址空间,返回共享内存的起始地址(shared_memory
)。
- 使用
-
使用 fork 创建子进程:
- 使用
fork
函数创建一个子进程,这个子进程将与父进程共享同一块内存。
- 使用
-
在父进程中写入数据:
- 在父进程中,通过
sprintf
将一条消息写入共享内存。
- 在父进程中,通过
-
在子进程中读取数据:
- 在子进程中,通过
printf
读取并显示从父进程写入的消息。
- 在子进程中,通过
-
等待子进程结束:
- 在父进程中使用
wait
函数等待子进程结束。
- 在父进程中使用
-
分离和删除共享内存:
- 使用
shmdt
函数将共享内存从进程中分离。 - 使用
shmctl
函数删除共享内存段。
- 使用
问题二:无限(不间断)地生成随机数(随机数范围:0-9)的代码,在生成的随机数串中,两个随机数之间随机地添加上“+、-、*、/”这四个运算中的任意一种。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int generate_random_number() {
return rand() % 10; // 生成 0 到 9 的随机数
}
char generate_random_operator() {
char operators[] = {'+', '-', '*', '/'};
int index = rand() % 4; // 随机选择运算符的索引
return operators[index];
}
int main() {
srand(time(NULL)); // 使用当前时间作为随机数种子
while (1) {
int num1 = generate_random_number();
char op = generate_random_operator();
int num2 = generate_random_number();
// 打印生成的随机数和运算符
printf("%d %c %d\n", num1, op, num2);
// 等待一段时间,模拟生成间隔
usleep(500000); // 等待 0.5 秒
}
return 0;
}
这段代码是一个简单的C语言程序,通过循环不断生成两个随机数和一个运算符,并打印在控制台上。下面是对代码的主要分析:
-
头文件和库:
#include <stdio.h>
:标准输入输出库,用于打印输出。#include <stdlib.h>
:标准库,包含rand
函数等。#include <time.h>
:标准时间库,用于为rand
函数设置种子。
-
随机数生成函数:
generate_random_number
函数用于生成范围在 0 到 9 之间的随机整数。generate_random_operator
函数用于随机选择四则运算符+、-、*、/
中的一个。
-
主函数:
srand(time(NULL))
:使用当前时间作为随机数生成器的种子,确保每次运行时生成的随机数序列是不同的。- 无限循环:
while (1)
,程序会一直运行,不断生成随机数和运算符,并打印到控制台。 - 生成两个随机数和一个运算符:
int num1 = generate_random_number(); char op = generate_random_operator(); int num2 = generate_random_number();
- 打印生成的随机数和运算符:
printf("%d %c %d\n", num1, op, num2);
- 等待一段时间,模拟生成间隔:
usleep(500000);
,等待 0.5 秒。
-
注意事项:
由于程序中存在无限循环,你需要手动停止程序的执行,比如使用Ctrl+C
终止程序。