[英]pipe bad file descriptor error
好。 因此,我试图制作一个将创建3个进程的程序:A,B和C。我希望消息以这种方式传播:
标准输入->(A-> B-> C-> A)->标准输出
现在的问题是,当我运行此程序时,我得到:
错误:进程B中的错误:close(pipeB [1])3 4(9;错误的文件描述符)
有趣的是,如果我注释掉上一行,那就是:
if(close(pipeB[0] == -1)) syserr("Error in process B: %s\n", "close(pipeB[0])")
运行该程序后没有收到任何错误消息。
char message[] = "Hello from process A!\n";
int buffA_len;
char buffA [BUF_SIZE];
int main (int argc, char *argv[])
{
int pipeA[2];
int pipeC[2];
if(pipe(pipeA) == -1) syserr("Error in pipeA\n");
if(pipe(pipeC) == -1) syserr("Error in pipeC\n");
switch(fork()){
case -1:
syserr("Error in first fork()\n");
case 0: ;
int buffA_rec_len;
int a = pipeA[1];
int b = pipeA[0];
if(close (pipeA[1]) == -1) syserr("Error in process B: %s\n", "close(pipeA[1])");
if(close (0) == -1) syserr("Error in process B: %s\n", "close(0)");
if(dup (pipeA[0]) == -1) syserr("Error in process B: %s\n", "dup(pipeA[0])");
if(close (pipeA[0]) == -1) syserr("Error in process B: %s\n", "close(pipeA[0])");
int pipeB[2];
if(pipe(pipeB) == -1) syserr("Error in pipeB\n");
switch(fork()){
case -1:
syserr("Error in second fork()\n");
case 0:
if(close (pipeB[1]) == -1) syserr("Error in process C: %s\n", "close(pipeB[1])");
if(close (0) == -1) syserr("Error in process C: %s\n", "close(0)");
if(dup(pipeB[0]) == -1) syserr("Error in process C: %s\n", "dup(pipeB[0])");
if(close (pipeB[0]) == -1) syserr("Error in process C: %s\n", "close(pipeB[0])");
if(close(pipeC[0]) == -1) syserr("Error in process C: %s\n", "close(pipeC[0])");
if(close (1) == -1) syserr("Error in process C: %s\n", "close(1)");
if(dup(pipeC[1]) == -1) syserr("Error in process C: %s\n", "dup(pipeC[1])");
if(close (pipeC[1]) == -1) syserr("Error in process C: %s\n", "close(pipeC[1])");
exit(0);
default:
if(close (1) == -1) syserr("Error in process B: %s\n", "close(1)");
if(dup(pipeB[1]) == -1) syserr("Error in process B: %s\n", "dup(pipeB[1])");
/*Here are those lines!*/
int b0 = pipeB[0];
int b1 = pipeB[1];
if(close(pipeB[0] == -1)) syserr("Error in process B: %s\n", "close(pipeB[0])");
if(close(pipeB[1] == -1)) syserr("Error in process B: %s %d %d\n", "close(pipeB[1])",b0,b1);
if(close(pipeC[0]) == -1) syserr("Error in process B: %s\n", "close(pipeC[0])");
if(close(pipeC[1]) == -1) syserr("Error in process B: %s\n", "close(pipeC[1])");
exit(0);
}
exit(0);
default:
if(close(pipeA[0]) == -1) syserr("Error in process A: %s\n", "close(pipeA[0])");
if(close(pipeC[1]) == -1) syserr("Error in process A: %s\n", "close(pipeC[1])");
}
}
有什么想法吗?
以下几行尝试关闭pipeB[0] == -1
的int
值:
if(close(pipeB[0] == -1)) syserr("Error in process B: %s\n", "close(pipeB[0])");
if(close(pipeB[1] == -1)) syserr("Error in process B: %s %d %d\n", "close(pipeB[1])",b0,b1);
您实际上正在寻找:
if(close(pipeB[0]) == -1) syserr("Error in process B: %s\n", "close(pipeB[0])");
if(close(pipeB[1]) == -1) syserr("Error in process B: %s %d %d\n", "close(pipeB[1])",b0,b1);
注意比较是如何在close
调用参数之外进行的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.