6. 编写生产者、消费者程序。 (1) 消费者程序中创建一个共享内存段,并将其中的内容显示出来; (2) 生产者连接到一个已有的共享内存段,并允许向其中写入数据。
时间: 2023-12-14 20:38:53 浏览: 65
以下是一个基于Linux的生产者和消费者程序示例,使用了共享内存来进行进程间通信:
生产者程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
int main() {
key_t key = ftok(".", 'a'); // 生成共享内存key
int shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666); // 创建共享内存段
if (shmid == -1) {
perror("shmget error");
exit(EXIT_FAILURE);
}
char *shmaddr = shmat(shmid, NULL, 0); // 将共享内存段附加到进程地址空间
if (shmaddr == (void *)-1) {
perror("shmat error");
exit(EXIT_FAILURE);
}
int index = 0;
while (1) { // 不断向共享内存段写入数据
sprintf(shmaddr, "Hello, World! %d\n", index++);
sleep(1);
}
shmdt(shmaddr); // 分离共享内存段
shmctl(shmid, IPC_RMID, 0); // 删除共享内存段
return 0;
}
```
消费者程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
int main() {
key_t key = ftok(".", 'a'); // 获取共享内存key
int shmid = shmget(key, SHM_SIZE, 0666); // 连接到已有的共享内存段
if (shmid == -1) {
perror("shmget error");
exit(EXIT_FAILURE);
}
char *shmaddr = shmat(shmid, NULL, 0); // 将共享内存段附加到进程地址空间
if (shmaddr == (void *)-1) {
perror("shmat error");
exit(EXIT_FAILURE);
}
while (1) { // 不断从共享内存段读取数据并显示
printf("%s", shmaddr);
sleep(1);
}
shmdt(shmaddr); // 分离共享内存段
return 0;
}
```
在运行时,先运行生产者程序来创建和写入共享内存段,然后再运行消费者程序来连接到已有的共享内存段并读取其中的数据。可以看到,生产者程序不断向共享内存段写入数据,而消费者程序不断从共享内存段读取数据并显示出来。两个程序之间通过共享内存段完成了数据的传递。
阅读全文