373737

#include <stdio.h>

#include <stdlib.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <sys/sem.h>

#include <unistd.h>

// 定义共享内存大小和缓冲池大小

#define SHARED_MEMORY_SIZE 1024

#define BUFFER_SIZE 5

// 定义缓冲区状态

#define EMPTY 0

#define FULL 1

// 定义信号量操作结构体

struct sembuf acquire = {0, -1, SEM_UNDO};

struct sembuf release = {0, 1, SEM_UNDO};

// 定义共享内存结构体

struct shared_memory {

    int buffer[BUFFER_SIZE];

    int status[BUFFER_SIZE];

};

int main() {

    key_t key = ftok(".", 'S');

    int shmid = shmget(key, sizeof(struct shared_memory), IPC_CREAT | 0666);

    int semid = semget(key, 1, IPC_CREAT | 0666);

    struct shared_memory *shared_mem = (struct shared_memory *) shmat(shmid, NULL, 0);

    // 初始化缓冲池的状态为EMPTY

    int i;

    for (i = 0; i < BUFFER_SIZE; i++) {

        shared_mem->status[i] = EMPTY;

    }

    // 生产者任务

    FILE *input_file = fopen("input.txt", "r");

    if (input_file == NULL) {

        printf("Failed to open input file.\n");

        return 1;

    }

    int item;

    while (fscanf(input_file, "%d", &item) == 1) {

        sleep(rand() % 3);  // 模拟生产时间

        semop(semid, &acquire, 1);  // 请求信号量

        // 在缓冲池中找到一个空的位置

        int i;

        for (i = 0; i < BUFFER_SIZE; i++) {

            if (shared_mem->status[i] == EMPTY) {

                shared_mem->buffer[i] = item;

                shared_mem->status[i] = FULL;

                printf("Produced item: %d\n", item);

                break;

            }

        }

        semop(semid, &release, 1);  // 释放信号量

    }

    fclose(input_file);

    shmdt(shared_mem);

    shmctl(shmid, IPC_RMID, NULL);

    semctl(semid, 0, IPC_RMID);

    return 0;

}

#include <stdio.h>

#include <stdlib.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <sys/sem.h>

#include <unistd.h>

// 定义共享内存大小和缓冲池大小

#define SHARED_MEMORY_SIZE 1024

#define BUFFER_SIZE 5

// 定义缓冲区状态

#define EMPTY 0

#define FULL 1

// 定义信号量操作结构体

struct sembuf acquire = {0, -1, SEM_UNDO};

struct sembuf release = {0, 1, SEM_UNDO};

// 定义共享内存结构体

struct shared_memory {

    int buffer[BUFFER_SIZE];

    int status[BUFFER_SIZE];

};

int main() {

    key_t key = ftok(".", 'S');

    int shmid = shmget(key, sizeof(struct shared_memory), IPC_CREAT | 0666);

    int semid = semget(key, 1, IPC_CREAT | 0666);

    struct shared_memory *shared_mem = (struct shared_memory *) shmat(shmid, NULL, 0);

    // 消费者任务

    FILE *output_file = fopen("output.txt", "w");

    if (output_file == NULL) {

        printf("Failed to open output file.\n");

        return 1;

    }

    while (1) {

        sleep(rand() % 3);  // 模拟消费时间

        semop(semid, &acquire, 1);  // 请求信号量

        // 在缓冲池中找到一个满的位置

        int i;

        for (i = 0; i < BUFFER_SIZE; i++) {

            if (shared_mem->status[i] == FULL) {

                int item = shared_mem->buffer[i];

                shared_mem->status[i] = EMPTY;

                printf("Consumed item: %d\n", item);

                fprintf(output_file, "%d\n", item);

                break;

            }

        }

        semop(semid, &release, 1);  // 释放信号量

    }

    fclose(output_file);

    shmdt(shared_mem);

    return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值