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

3

我正在使用LINUX下的C++编程。我有两个独立的进程,需要使用命名管道进行通信。

读者: - 使用mkfifo创建FIFO - 状态=mkfifo(myFIFO, 0666) - 使用open打开管道 - fifo=open(myFIFO, O_RDONLY) - 从管道中读取 - num=read(fifo, temp, sizeof(temp))

写者: - 打开管道 - fifo=open(myFIFO, O_WRONLY); - 向管道中写入数据 - num=write(fifo, string, strlen(string));

我注意到读进程和写进程返回的文件描述符都是0。此外,在执行write命令后,我可以在终端上看到应该写入管道的字符串。我不知道为什么会在终端上显示它...另外,写入的字节数为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;
     }
}

1
你可以在strace下运行它并发布日志吗? - jpalecek
1
请发布命名和打开管道的代码,以及您读/写它的位置。 - James
1
发布你的代码,当我们能看到你的问题时,帮助你会更容易。 - Sam Miller
1
我是Linux的新手,我尝试使用strace,但它没有起作用。我尝试了strace read.cpp... 我必须更多地在谷歌上搜索关于strace的信息... - MarijaS
1
你应该执行 strace your_binary - jpalecek
我之前不知道strace,但我发现它可能非常有用... 然而,当我尝试时,出现了“命令未找到”的错误... - MarijaS
2个回答

9

您的代码中基本上至少有四个错误。当您创建FIFO时,必须使用“open”调用返回的文件描述符。然而,您正在将其与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的代码中,存在完全相同的两个错误。

你说得完全正确! 我一直在寻找错误,但是我没有看到这个问题... 显然,我必须更加努力练习... 谢谢!!! - MarijaS
@MarijaS 欢迎你。这个问题涉及到计算顺序。随着经验的积累,你会自然而然地掌握这个概念。我建议你在学习过程中不要试图为了节省一行代码而牺牲理解 :-) - user405725

1
问题在于你的代码:fifo = open(myFIFO, O_WRONLY) < 0 会被解释为 fifo = (open(myFIFO, O_WRONLY) < 0)。你得到零是因为 open() 返回的值是 >= 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接