#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <string.h>
#define SHM_KEY 1234
#define SEM_KEY 5678
struct BufferPool
{
char Buffer[5][100];
int Index[5];
};
// 定义信号量操作结构体
struct sembuf sem_lock = {0, -1, SEM_UNDO};
struct sembuf sem_unlock = {0, 1, SEM_UNDO};
void producer(const char *inputFile)
{
// 获取共享内存
int shmid = shmget(SHM_KEY, sizeof(struct BufferPool), 0666);
if (shmid == -1)
{
perror("shmget");
exit(1);
}
struct BufferPool *buffer = (struct BufferPool *)shmat(shmid, NULL, 0);
FILE *input = fopen(inputFile, "r");
char line[100];
// 获取信号量
int semid = semget(SEM_KEY, 1, 0666);
if (semid == -1)
{
perror("semget");
exit(1);
}
while (fgets(line, sizeof(line), input) != NULL)
{
// 等待可用的缓冲区
semop(semid, &sem_lock, 1);
// 查找可用的缓冲区
int i;
for (i = 0; i < 5; i++)
{
if (buffer->Index[i] == 0)
break;
}
// 写入数据到缓冲区
strcpy(buffer->Buffer[i], line);
buffer->Index[i] = 1;
printf("Producer: Wrote \"%s\" to buffer %d\n", line, i);
// 释放缓冲区的访问权
semop(semid, &sem_unlock, 1);
}
fclose(input);
shmdt(buffer);
}
int main()
{
const char *inputFile = "input.txt";
producer(inputFile);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define SHM_KEY 1234
#define SEM_KEY 5678
struct BufferPool
{
char Buffer[5][100];
int Index[5];
};
// 定义信号量操作结构体
struct sembuf sem_lock = {0, -1, SEM_UNDO};
struct sembuf sem_unlock = {0, 1, SEM_UNDO};
void consumer(const char *outputFile)
{
// 获取共享内存
int shmid = shmget(SHM_KEY, sizeof(struct BufferPool), 0666);
if (shmid == -1)
{
perror("shmget");
exit(1);
}
struct BufferPool *buffer = (struct BufferPool *)shmat(shmid, NULL, 0);
FILE *output = fopen(outputFile, "w");
// 获取信号量
int semid = semget(SEM_KEY, 1, 0666);
if (semid == -1)
{
perror("semget");
exit(1);
}
while (1)
{
// 等待可消费的缓冲区
semop(semid, &sem_lock, 1);
// 查找可消费的缓冲区
int i;
for (i = 0; i < 5; i++)
{
if (buffer->Index[i] == 1)
break;
}
// 读取数据并写入输出文件
fputs(buffer->Buffer[i], output);
printf("Consumer: Read \"%s\" from buffer %d\n", buffer->Buffer[i], i);
// 重置缓冲区状态
buffer->Index[i] = 0;
// 释放缓冲区的访问权
semop(semid, &sem_unlock, 1);
// 结束条件:如果所有缓冲区都已经被消费,则退出循环
int allConsumed = 1;
for (i = 0; i < 5; i++)
{
if (buffer->Index[i] == 1)
{
allConsumed = 0;
break;
}
}
if (allConsumed)
break;
}
fclose(output);
shmdt(buffer);
}
int main()
{
const char *outputFile = "output.txt";
consumer(outputFile);
return 0;
}