繁体   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