#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#define MAX_FRUITS 10
struct semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
void sem_init(int semid, int sem_num, int val) {
struct semun arg;
arg.val = val;
if (semctl(semid, sem_num, SETVAL, arg) == -1) {
perror("semctl");
exit(1);
}
}
void sem_wait(int semid, int sem_num) {
struct sembuf sb;
sb.sem_num = sem_num;
sb.sem_op = -1;
sb.sem_flg = SEM_UNDO;
if (semop(semid, &sb, 1) == -1) {
perror("semop");
exit(1);
}
}
void sem_signal(int semid, int sem_num) {
struct sembuf sb;
sb.sem_num = sem_num;
sb.sem_op = 1;
sb.sem_flg = SEM_UNDO;
if (semop(semid, &sb, 1) == -1) {
perror("semop");
exit(1);
}
}
int main() {
int semid, num_fruits;
key_t key;
pid_t pid;
/* Create a new semaphore set */
key = ftok(".", 's');
semid = semget(key, 2, 0666 | IPC_CREAT);
if (semid == -1) {
perror("semget");
exit(1);
}
/* Initialize the semaphore values */
sem_init(semid, 0, MAX_FRUITS); /* Available buffer slots */
sem_init(semid, 1, 0); /* Number of fruits in buffer */
/* Fork a new process to act as the producer */
pid = fork();
if (pid == -1) {
perror("fork");
exit(1);
}
if (pid == 0) {
/* Producer code */
while (1) {
sem_wait(semid, 0); /* Wait for an available buffer slot */
printf("Producer: adding fruit to buffer\n");
num_fruits++;
sem_signal(semid, 1); /* Increment number of fruits in buffer */
sleep(1);
}
} else {
/* Consumer code */
while (1) {
sem_wait(semid, 1); /* Wait for a fruit in the buffer */
printf("Consumer: eating a fruit from buffer\n");
num_fruits--;
sem_signal(semid, 0); /* Increment available buffer slots */
sleep(1);
}
}
/* Remove the semaphore set */
if(semctl(semid, 0, IPC_RMID, 0) == -1) {
perror("semctl");
exit(1);
}
return 0;
}
//gcc -o prodcons prodcons.c -lpthread
编写程序,使用Linux操作系统中的信号量机制模拟实现生产者-消费者问题。设有一个生产者可以生产水果并放入缓冲区(最多只能放10个水果),有一个消费者,不断从缓冲区中取出水果,并吃掉水果。
最新推荐文章于 2023-05-11 18:43:19 发布