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

时间:2017-05-28 07:22:13

标签: c linux macos pipe

此代码在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 个答案:

答案 0 :(得分:3)

这里有两个错误:

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

  2. 您正在将这三个失败案例合并为第二个read()中的一个,这可能解释了您报告的症状。没有任何强制要求read()必须阻止它才能从管道中获取treeBytes。对于阻塞FD,允许一次返回1个字节,对于非阻塞FD,允许返回0。正如Mark Sechell在上面所做的那样,读取一个循环,直到你有足够多的字节,你会发现你遇到错误的情况。