簡體   English   中英

管道錯誤文件描述符錯誤

[英]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] == -1int值:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM