C 使用关闭的文件描述符阻止读取

C 使用关闭的文件描述符阻止读取,c,unix,pipe,ipc,C,Unix,Pipe,Ipc,我在一个循环链接中组织了三个过程:P1->P2->P3->P1。我为三个链接中的每一个都有3个未命名的管道。每个进程从左边的邻居处读取一个整数,并在写操作中将一个整数写入邻居。一段时间后,其中一个过程将满足终止条件。这将使该进程关闭其打开的文件描述符并终止。但是,其他进程仍然能够写入现已关闭的fd,并且读取被阻塞。我是否误解了无名管道的工作原理 void monitor(int *fdr, int *fdw, int pid) { int A,B,ret,avg; char send_b

我在一个循环链接中组织了三个过程:P1->P2->P3->P1。我为三个链接中的每一个都有3个未命名的管道。每个进程从左边的邻居处读取一个整数,并在写操作中将一个整数写入邻居。一段时间后,其中一个过程将满足终止条件。这将使该进程关闭其打开的文件描述符并终止。但是,其他进程仍然能够写入现已关闭的fd,并且读取被阻塞。我是否误解了无名管道的工作原理

void monitor(int *fdr, int *fdw, int pid) {
  int A,B,ret,avg;
  char send_buf[10], recv_buf[10];
  srand((unsigned int) fdr);

  A = 20;
  close(fdr[1]); close(fdw[0]);

  while(1) {
    B = rand() % 30;
    avg = (A+B)/2;
    if (avg > 20) {
      printf("P%d computes to high avg. Quit!\n",pid);
      break;
    }

    sprintf(send_buf, "%d", avg);
    printf("P%d will write %s\n",pid,send_buf);
    ret = write(fdw[1],send_buf,strlen(send_buf)+1);
    if (ret == 0) {
      printf("P%d cant write. Quit\n",pid);
      break;
    }
    printf("P%d successful write=%d\n", pid, ret);
    ret = read(fdr[0], recv_buf,10);
    if (ret == 0) {
      printf("P%d cant read. Quit\n",pid);
      break;
    }

    printf("P%d reads %s\n",pid,recv_buf);
    A = atoi(recv_buf);
  }
  // Closing filedescriptors should also break the other
  // processes out of the while loop
  close(fdr[0]); 
  close(fdw[1]);
  printf("P%d closed all descriptors\n",pid);
}

如果您的代码不正确,您是否在其他地方处理信号?IIRC,将管道关闭到另一个进程,这样应该会导致该进程接收SIGPIPE。如果您分叉了进程,您确定您关闭了父进程中的管道实例吗?谢谢您的回复。我确实关闭了父进程中的管道实例。但问题似乎是在两个子进程应该使用的父进程中创建管道时出现的。我决定使用命名管道(FIFO)来解决这个问题,但没有问题。如果您的代码不可用,您是否在其他地方处理信号?IIRC,将管道关闭到另一个进程,这样应该会导致该进程接收SIGPIPE。如果您分叉了进程,您确定您关闭了父进程中的管道实例吗?谢谢您的回复。我确实关闭了父进程中的管道实例。但问题似乎是在两个子进程应该使用的父进程中创建管道时出现的。我决定使用命名管道(FIFO)解决这个问题,并且没有问题。