首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cygwin FIFO与本地Linux FIFO -阻塞行为的差异?

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

Stack Overflow用户
提问于 2019-01-02 15:19:34
回答 1查看 235关注 0票数 0

所示代码基于一个示例,该示例使用来自某个教程站点的命名管道。

server.c

代码语言:javascript
复制
#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,然后服务器进入一个不想要的循环,重复相同的消息。例如,如果您在shell中编写:

代码语言:javascript
复制
$ ./server
|

然后,“服务器”等待客户端,但是当FIFO不是空的时候,例如在一个新的shell中写入

代码语言:javascript
复制
$ echo "Hello" > MYFIFO

然后,服务器进入一个无限循环,重复"Hello"-string

代码语言:javascript
复制
Received string: "Hello". Length is 4
Received string: "Hello". Length is 4
...

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-02 15:33:15

您需要修复您的代码以删除至少3个bug:

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

您没有检查fd的值(如果它返回-1,则会出现错误)。

您没有检查read的值(如果它返回-1,则会有一个错误).因此,您的readbuf[read_bytes] = '\0';将不会做您期望的事情。

当你遇到错误时,errno会告诉你哪里出了问题。

这些bug可能解释了为什么您一直得到Hello输出(特别是readbuf[read_bytes]问题)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54025368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档