6.编写生产者、消费者程序。 (1)消费者程序中创建一个共享内存段,并将其中的内容显示出来; (2)生产者连接到一个已有的共享内存段,并允许向其中写入数据。
时间: 2024-01-24 10:16:50 浏览: 21
以下是一个简单的生产者、消费者程序示例,使用了共享内存和信号量来实现进程间同步和通信:
生产者程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define SHM_SIZE 1024
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
int main() {
// 创建共享内存和信号量
int shm_id = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666);
if (shm_id < 0) {
perror("shmget");
exit(1);
}
int sem_id = semget(IPC_PRIVATE, 1, IPC_CREAT | 0666);
if (sem_id < 0) {
perror("semget");
exit(1);
}
// 初始化信号量
union semun sem_init;
sem_init.val = 0;
if (semctl(sem_id, 0, SETVAL, sem_init) < 0) {
perror("semctl");
exit(1);
}
// 连接共享内存
char *shm_ptr = (char *)shmat(shm_id, NULL, 0);
if (shm_ptr == (char *)-1) {
perror("shmat");
exit(1);
}
// 循环读取用户输入并写入共享内存
while (1) {
printf("Enter a message: ");
fgets(shm_ptr, SHM_SIZE, stdin);
// 发送信号给消费者
struct sembuf sem_op;
sem_op.sem_num = 0;
sem_op.sem_op = 1;
sem_op.sem_flg = 0;
if (semop(sem_id, &sem_op, 1) < 0) {
perror("semop");
exit(1);
}
}
// 断开共享内存
if (shmdt(shm_ptr) < 0) {
perror("shmdt");
exit(1);
}
// 删除共享内存和信号量
if (shmctl(shm_id, IPC_RMID, NULL) < 0) {
perror("shmctl");
exit(1);
}
if (semctl(sem_id, 0, IPC_RMID) < 0) {
perror("semctl");
exit(1);
}
return 0;
}
```
消费者程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define SHM_SIZE 1024
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
int main() {
// 获取共享内存和信号量
int shm_id = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666);
if (shm_id < 0) {
perror("shmget");
exit(1);
}
int sem_id = semget(IPC_PRIVATE, 1, IPC_CREAT | 0666);
if (sem_id < 0) {
perror("semget");
exit(1);
}
// 连接共享内存
char *shm_ptr = (char *)shmat(shm_id, NULL, 0);
if (shm_ptr == (char *)-1) {
perror("shmat");
exit(1);
}
// 循环读取共享内存并输出
while (1) {
// 等待生产者发送信号
struct sembuf sem_op;
sem_op.sem_num = 0;
sem_op.sem_op = -1;
sem_op.sem_flg = 0;
if (semop(sem_id, &sem_op, 1) < 0) {
perror("semop");
exit(1);
}
// 输出共享内存内容
printf("Received message: %s", shm_ptr);
}
// 断开共享内存
if (shmdt(shm_ptr) < 0) {
perror("shmdt");
exit(1);
}
// 删除共享内存和信号量
if (shmctl(shm_id, IPC_RMID, NULL) < 0) {
perror("shmctl");
exit(1);
}
if (semctl(sem_id, 0, IPC_RMID) < 0) {
perror("semctl");
exit(1);
}
return 0;
}
```