使用c语言创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者不断地从缓冲中读取一个字符并输出。为了使得程序的输出易于看到结果,仿照的实例程序,分别在生产者和消费者进程的合适的位置加入一些随机睡眠时间。
时间: 2024-01-24 19:17:04 浏览: 62
以下是使用C语言创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <ctype.h>
#define BUFFER_SIZE 5
int buffer[BUFFER_SIZE]; // 缓冲区
int in = 0; // 生产者进程写入缓冲区的位置
int out = 0; // 消费者进程读取缓冲区的位置
// 用于生成随机大小写字母
char rand_uppercase_letter() {
return 'A' + rand() % 26;
}
char rand_lowercase_letter() {
return 'a' + rand() % 26;
}
// 生产者进程函数,往缓冲区中写入大写字母
void producer_uppercase(int fd) {
while (1) {
char c = rand_uppercase_letter();
sleep(rand() % 3); // 随机睡眠一段时间
int item = toupper(c);
printf("Producer uppercase: %c\n", item);
fflush(stdout);
write(fd, &item, sizeof(item)); // 写入管道
}
}
// 生产者进程函数,往缓冲区中写入小写字母
void producer_lowercase(int fd) {
while (1) {
char c = rand_lowercase_letter();
sleep(rand() % 3); // 随机睡眠一段时间
int item = tolower(c);
printf("Producer lowercase: %c\n", item);
fflush(stdout);
write(fd, &item, sizeof(item)); // 写入管道
}
}
// 消费者进程函数,从缓冲区中读取字符并输出
void consumer(int fd) {
while (1) {
int item;
read(fd, &item, sizeof(item)); // 读取管道
sleep(rand() % 3); // 随机睡眠一段时间
printf("Consumer: %c\n", item);
fflush(stdout);
}
}
int main() {
int fd[2];
pipe(fd); // 创建管道
int i;
for (i = 0; i < 2; i++) {
if (fork() == 0) {
close(fd[0]); // 关闭读端
if (i == 0) {
producer_uppercase(fd[1]); // 生产者进程写入大写字母
} else {
producer_lowercase(fd[1]); // 生产者进程写入小写字母
}
close(fd[1]); // 关闭写端
exit(0);
}
}
for (i = 0; i < 3; i++) {
if (fork() == 0) {
close(fd[1]); // 关闭写端
consumer(fd[0]); // 消费者进程从缓冲区中读取字符并输出
close(fd[0]); // 关闭读端
exit(0);
}
}
close(fd[0]); // 关闭管道的读端和写端
close(fd[1]);
for (i = 0; i < 5; i++) {
wait(NULL); // 等待子进程结束
}
return 0;
}
```
在上面的示例代码中,我们首先创建了一个长度为5的缓冲区,使用管道来进行生产者和消费者之间的通信。然后创建了两个生产者进程和三个消费者进程,并且分别在生产者和消费者进程的合适位置加入了一些随机睡眠时间,以便程序输出结果更具可读性。最后使用wait()函数等待子进程的结束。
阅读全文