У меня есть три процесса, организованных по кольцевой ссылке: P1-> P2-> P3-> P1. У меня есть 3 безымянных канала для каждой из трех ссылок. Каждый процесс читает целое число от своего соседа слева и записывает целое число в соседнюю запись. Через некоторое время условие завершения будет выполнено в одном из процессов. Это заставит этот процесс закрыть его дескрипторы открытого файла и завершится. Тем не менее, другие процессы все еще могут записывать в закрытый файл, и чтение блокируется. Я неправильно понял, как неназванные каналы действительно работают?
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);
}