所示代码基于一个示例,该示例使用来自某个教程站点的命名管道。
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,然后服务器进入一个不想要的循环,重复相同的消息。例如,如果您在shell中编写:
$ ./server
|然后,“服务器”等待客户端,但是当FIFO不是空的时候,例如在一个新的shell中写入
$ echo "Hello" > MYFIFO然后,服务器进入一个无限循环,重复"Hello"-string
Received string: "Hello". Length is 4
Received string: "Hello". Length is 4
...此外,写入fifo的新字符串似乎不被服务器读取。然而,在Linux中,这种行为是完全不同的。在Linux中,服务器打印字符串并等待新数据出现在fifo上。出现这种差异的原因是什么?
发布于 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]问题)。
https://stackoverflow.com/questions/54025368
复制相似问题