6.编写生产者、消费者程序。 (1)消费者程序中创建一个共享内存段,并将其中的内容显示出来; (2)生产者连接到一个已有的共享内存段,并允许向其中写入数据。C语言实现
时间: 2023-12-03 09:43:49 浏览: 59
C语言实现操作系统中生产者消费者
以下是一个简单的生产者、消费者程序实现,使用共享内存进行通信:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <string.h>
#define SHM_SIZE 1024 // 共享内存大小
int main(void) {
int shmid; // 共享内存ID
char *shmaddr; // 共享内存地址
char input[SHM_SIZE]; // 输入缓冲区
// 创建共享内存
if ((shmid = shmget((key_t)1234, SHM_SIZE, IPC_CREAT|0666)) == -1) {
perror("shmget");
exit(1);
}
// 连接共享内存
if ((shmaddr = shmat(shmid, NULL, 0)) == (void*)-1) {
perror("shmat");
exit(1);
}
// 消费者程序
while (1) {
// 读取共享内存中的内容并显示
printf("Received message: %s\n", shmaddr);
// 休眠一段时间
sleep(1);
}
// 断开共享内存连接
if (shmdt(shmaddr) == -1) {
perror("shmdt");
exit(1);
}
// 删除共享内存
if (shmctl(shmid, IPC_RMID, 0) == -1) {
perror("shmctl");
exit(1);
}
return 0;
}
```
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <string.h>
#define SHM_SIZE 1024 // 共享内存大小
int main(void) {
int shmid; // 共享内存ID
char *shmaddr; // 共享内存地址
char input[SHM_SIZE]; // 输入缓冲区
// 连接共享内存
if ((shmid = shmget((key_t)1234, SHM_SIZE, 0666)) == -1) {
perror("shmget");
exit(1);
}
if ((shmaddr = shmat(shmid, NULL, 0)) == (void*)-1) {
perror("shmat");
exit(1);
}
// 生产者程序
while (1) {
// 从终端读取输入
printf("Enter message: ");
fgets(input, SHM_SIZE, stdin);
// 写入共享内存
strncpy(shmaddr, input, SHM_SIZE);
// 休眠一段时间
sleep(1);
}
// 断开共享内存连接
if (shmdt(shmaddr) == -1) {
perror("shmdt");
exit(1);
}
return 0;
}
```
以上代码实现了一个简单的生产者、消费者程序,它们通过共享内存进行通信。其中,生产者程序从终端读取输入,并将输入写入共享内存;消费者程序读取共享内存中的内容,并输出到终端。程序中使用了Linux系统提供的共享内存相关函数,包括shmget、shmat、shmdt和shmctl等。需要注意的是,使用共享内存进行通信时要确保生产者和消费者访问共享内存的方式和位置一致,否则可能会发生读写冲突。
阅读全文