Cygwin FIFO与本机Linux FIFO-阻塞行为的差异?

Cygwin FIFO与本机Linux FIFO-阻塞行为的差异?,cygwin,fifo,Cygwin,Fifo,显示的代码基于使用某个教程站点中命名管道的示例 服务器.c #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #define FIFO_FILE "MYFIFO" int main() { int fd;

显示的代码基于使用某个教程站点中命名管道的示例

服务器.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

#define FIFO_FILE "MYFIFO"

int main()
{
        int fd;
        char readbuf[80];
        int read_bytes;

        // mknod(FIFO_FILE, S_IFIFO|0640, 0);
        mkfifo(FIFO_FILE, 0777);
        while(1) {
                fd = open(FIFO_FILE, O_RDONLY);
                read_bytes = read(fd, readbuf, sizeof(readbuf));
                readbuf[read_bytes] = '\0';
                printf("Received string: \"%s\". Length is %d\n", readbuf, (int)strlen(readbuf));
        }
        return 0;
}
然后,服务器等待客户端,但当FIFO不为空时,例如,在新外壳中写入

$ echo "Hello" > MYFIFO
然后服务器进入无限循环,重复Hello字符串

Received string: "Hello". Length is 4
Received string: "Hello". Length is 4
...

此外,写入fifo的新字符串似乎不会被服务器读取。然而,在Linux中,行为是完全不同的。在Linux中,服务器打印字符串并等待新数据出现在fifo上。出现这种差异的原因是什么?

您需要修复代码以删除至少3个错误:

您没有执行closefd,因此会出现文件描述符泄漏,最终无法打开新文件

您没有检查fd的值,如果它返回-1,则表明存在错误

如果read返回-1,则没有检查read的值,则出现错误。。。您的readbuf[read_bytes]='\0';结果将不会做您期望的事情

当你出错时,errno会告诉你哪里出错了


这些错误可能解释了为什么您不断获得Hello输出,尤其是readbuf[read_bytes]问题。

Hello\n怎么可能只有四个字节?当然,你可以看到你的代码一定有问题,即使你不能识别它。谢谢,我将对fd进行检查,或者将open移到循环之外,看看这是否有区别。然而,同样的代码在Ubuntu中也可以正常工作。请注意,代码是显示概念的最低限度。问题是行为的差异可能会导致出现错误,而这些错误正被缺乏错误处理所掩盖。修复错误将向您展示实现之间的差异,errno值可能会提供提示。还需要一个读取sizeofreadbuf-1的上限,以便您有地方写入尾随的\0。@roaima从OP的问题中指向的链接充满了可疑的东西——说得委婉一点。我想知道保留它有什么意义。将其编辑成类似于从教程网站获取此代码的内容,然后将该网站保留为未命名和未链接的状态,这不是更好吗?@unclebly不是很诱人吗。看到另一个例子完全失去了双向fifo的意义,我几乎哭了。。。
Received string: "Hello". Length is 4
Received string: "Hello". Length is 4
...