首页 > 解决方案 > 这个使用管道示例的生产者和消费者如何防止死锁?

问题描述

我正在查看使用管道的生产者和消费者问题的解决方案示例。

而且我不明白它是如何防止竞争条件的。

#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 个用于生产 - 它如何能够自动生产而不会出错?

标签: cpipe

解决方案


推荐阅读