Cygwin FIFO与本机Linux FIFO-阻止行为方面的差异?

时间:2019-01-02 15:19:34

标签: cygwin fifo

显示的代码基于一个示例,该示例使用了一些教程站点中的命名管道

server.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;
}

在Windows中使用Cygwin执行服务器时,服务器将进入不希望的循环,并重复相同的消息。例如,如果您在外壳中编写:

$ ./server
|

然后,“服务器”等待客户端,但是当FIFO不为空时,例如在新的外壳中编写

$ echo "Hello" > MYFIFO

然后服务器进入无限循环,重复“ Hello”字符串

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

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

1 个答案:

答案 0 :(得分:1)

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

您没有执行close(fd),因此您将收到文件描述符泄漏,最终将无法open()新文件。

您没有检查fd的值(如果它返回-1则表示错误)。

您没有检查read的值(如果它返回-1则出现错误)...并且您的readbuf[read_bytes] = '\0';将不会像预期的那样做结果。

遇到错误时,errno会告诉您出了什么问题。

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