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