[英]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.