c - 这个使用管道示例的生产者和消费者如何防止死锁?
问题描述
我正在查看使用管道的生产者和消费者问题的解决方案示例。
而且我不明白它是如何防止竞争条件的。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <ctype.h>
#include <string.h>
#include <errno.h>
#include <sys/wait.h>
void producer(FILE *pipe_write_end)
{
int i;
for(i = 1; i <= 10; i++) {
fprintf(pipe_write_end, "%d ", i);
}
fclose(pipe_write_end);
exit(0);
}
void consumer(FILE *pipe_read_end)
{
int n,k;
while(1) {
int n = fscanf(pipe_read_end, "%d", &k);
if(n == 1) printf("consumer: got %d\n", k);
else break;
}
fclose(pipe_read_end);
exit(0);
}
int main()
{
pid_t producer_id, consumer_id;
int pd[2];
FILE *pipe_write_end, *pipe_read_end;
pipe(pd);
pipe_read_end = fdopen(pd[0], "r");
pipe_write_end = fdopen(pd[1], "w");
producer_id = fork();
if(producer_id == 0) {
fclose(pipe_read_end);
producer(pipe_write_end);
}
consumer_id = fork();
if(consumer_id == 0) {
fclose(pipe_write_end);
consumer(pipe_read_end);
}
fclose(pipe_read_end);
fclose(pipe_write_end);
wait(NULL);
wait(NULL);
return 0;
}
我目前的想法是int n = fscanf(pipe_read_end, "%d", &k);
正在等待生产者关闭文件,但我不明白如何。
如果创建了 2 个子进程,1 个用于消费,1 个用于生产 - 它如何能够自动生产而不会出错?
解决方案
推荐阅读
- php - 测试抛出 RequestGuard::viaRemember() 在第二个请求中不存在
- api - 如何按某列中的值对行进行分组,然后使用 Google Sheets API 将它们导出到相应的新电子表格
- javascript - 如何下载网页客户端的预览?
- sql - 基于 2 列合并数据
- c - 如何正确使用C switch 语句
- javascript - 为什么我的成绩计划获得未定义的回报?
- python-3.x - 遍历数组中的行
- javascript - 页面上显示未定义的值,但 localStorage 仍然存在?
- javascript - 如何将新对象添加到 localStorage 中的对象数组中?
- django - Django意外地只存储密码哈希,而不是算法参数