命名管道 - write()和read()的问题

时间:2010-08-09 12:26:53

标签: c++ ipc process named-pipes

我在LINUX下用C ++编程。 我有两个独立的过程。我应该使用命名管道提供通信。

阅读器: 使用mkfifo创建FIFO - status = mkfifo(myFIFO,0666) - 使用open打开管道 - fifo = open(myFIFO,O_RDONLY) -reads from the pipe - num = read(fifo,temp,sizeof(temp))

编剧: - 打开管道 - fifo = open(myFIFO,O_WRONLY); -writes to pipe - num = write(fifo,string,strlen(string));

我注意到为读取进程返回了文件描述符 并且写入过程为0.此外,在命令写入后,我可以在我的终端上看到应该写入管道的字符串。我不知道为什么它会在终端上显示...而且,写入的字节数是0 ......

你能帮帮我吗? 谢谢!!!

// read.cpp:

#define myFIFO "/temp/FIFO"

int main(){
    int num, fifo, status;
    char temp[32];

    if (status = mkfifo(myFIFO, 0666) < 0) { 
     printf("\n %s \n", strerror(errno));
     return 0;
     }

     if (fifo = open(myFIFO, O_RDONLY) < 0) { 
     printf("\n %s \n", strerror(errno));
     return 0;
     }

     if (num= read(fifo, temp, sizeof(temp)) < 0) { 
     printf("\n %s \n", strerror(errno));
     return 0;
     }

    printf("In FIFO is %s \n", temp);
}

在另一个档案中:

// write.cpp:

#define myFIFO "/temp/FIFO"

int main() {
    int status, num, fifo;
    char string[]="Testing...";

     if (fifo = open(myFIFO, O_WRONLY) < 0) { 
     printf("\n %s \n", strerror(errno));
     return 0;
     }

     if (num= write(fifo, string, strlen(string)) < 0) { 
     printf("\n %s \n", strerror(errno));
     return 0;
     }
}

2 个答案:

答案 0 :(得分:8)

您的代码中至少有四个错误。创建FIFO时,必须使用“打开”调用返回的文件描述符。但是,您将它与0进行比较,并将比较结果分配给用于保存文件描述符的变量:

if (fifo = open(myFIFO, O_RDONLY) < 0) { 
    printf("\n %s \n", strerror(errno));
    return 0;
}

正确的代码应如下所示:

fifo = open(myFIFO, O_RDONLY);
if (fifo < 0) { 
    printf("\n %s \n", strerror(errno));
    return 0;
}

或者像这样,如果你坚持保存一行代码:

if ((fifo = open(myFIFO, O_RDONLY)) < 0) { 
    printf("\n %s \n", strerror(errno));
    return 0;
}

与阅读完全相同的故事:

if (num= read(fifo, temp, sizeof(temp)) < 0) { 
    printf("\n %s \n", strerror(errno));
    return 0;
}

正确的代码:

num = read(fifo, temp, sizeof(temp));
if (num < 0) { 
    printf("\n %s \n", strerror(errno));
    return 0;
}

在写入FIFO的代码中,存在完全相同的两个错误。

答案 1 :(得分:1)

问题在于您的代码:fifo = open(myFIFO, O_WRONLY) < 0的评估结果为fifo = (open(myFIFO, O_WRONLY) < 0)。您得到零,因为open()返回的值为>= 0