在Linux的shell编写脚本程序并运行——第四弹

话不多说,直接来吧。

问题一:分析下面代码:

#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环境下使用共享内存进行进程间通信的基本概念。以下是代码的主要功能和步骤:

  1. 创建共享内存:

    • 使用 ftok 函数创建一个用于共享内存的键值(key),这个键值通常基于一个文件路径和一个字符。
    • 使用 shmget 函数创建共享内存段,返回一个共享内存标识符(shm_id)。
  2. 连接共享内存:

    • 使用 shmat 函数将共享内存段连接到进程的地址空间,返回共享内存的起始地址(shared_memory)。
  3. 使用 fork 创建子进程:

    • 使用 fork 函数创建一个子进程,这个子进程将与父进程共享同一块内存。
  4. 在父进程中写入数据:

    • 在父进程中,通过 sprintf 将一条消息写入共享内存。
  5. 在子进程中读取数据:

    • 在子进程中,通过 printf 读取并显示从父进程写入的消息。
  6. 等待子进程结束:

    • 在父进程中使用 wait 函数等待子进程结束。
  7. 分离和删除共享内存:

    • 使用 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语言程序,通过循环不断生成两个随机数和一个运算符,并打印在控制台上。下面是对代码的主要分析:

  1. 头文件和库:

    • #include <stdio.h>:标准输入输出库,用于打印输出。
    • #include <stdlib.h>:标准库,包含 rand 函数等。
    • #include <time.h>:标准时间库,用于为 rand 函数设置种子。
  2. 随机数生成函数:

    • generate_random_number 函数用于生成范围在 0 到 9 之间的随机整数。
    • generate_random_operator 函数用于随机选择四则运算符 +、-、*、/ 中的一个。
  3. 主函数:

    • 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 秒。
  4. 注意事项:

    由于程序中存在无限循环,你需要手动停止程序的执行,比如使用 Ctrl+C 终止程序。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Umbra_squire233

谢谢大佬的投喂qwq

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值