此代码在Linux中运行良好,但对于MacOS,它总是无法读取树(它将读取太多字节)。它适用于从文件重定向。它在显式打开文件时读取。但是在管道上,总是太少的字节。
// Load the saved tree
uint16_t treeBytes = 0;
read(fileIn, &treeBytes, sizeof(treeBytes));
if (verbose) { printf("tree (%u)\n", treeBytes); }
uint8_t savedTree[treeBytes];
int readSz = read(fileIn, savedTree, treeBytes);
if (readSz != treeBytes)
{
fprintf(stderr, "%d != %u: ", readSz, treeBytes);
ERROR("Truncated tree read");
}
答案 0 :(得分:3)
这里有两个错误:
您没有检查第一次read()
来电的回复。这里有四种可能的返回,其中三种会破坏你的程序:错误时为-1,异常关闭时为0(仅适用于套接字),1为短读取,2为(sizeof(treeBytes)
)为成功读取。不要假设。
您正在将这三个失败案例合并为第二个read()
中的一个,这可能解释了您报告的症状。没有任何强制要求read()
必须阻止它才能从管道中获取treeBytes
。对于阻塞FD,允许一次返回1个字节,对于非阻塞FD,允许返回0。正如Mark Sechell在上面所做的那样,读取一个循环,直到你有足够多的字节,你会发现或你遇到错误的情况。