c - MacOS 中的管道总是读取太少的字节(但 Linux 可以工作)



这段代码在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");
    }

这里有两个错误:

  1. 您没有检查第一个read()呼叫的回报。这里有四种可能的返回,其中三种会破坏您的程序:错误时为 -1,异常关闭时为 0(仅适用于套接字(,1 表示短时间读取,2 (sizeof(treeBytes) ( 表示成功读取。不要假设。

  2. 您将这三个失败案例折叠为第二个read()中的一个,这可能解释了您报告的症状。没有任何规定要求read()必须阻止,直到它从管道中treeBytes。对于阻塞 FD,允许一次返回 1 个字节,对于非阻塞 FD,允许一次返回 0 个字节。正如马克·塞切尔(Mark Sechell(在上面所说的那样,循环读取,直到您拥有预期的字节数或遇到错误情况。

最新更新