Linux 文件操作测试程序未按预期运行

Linux file operations test program doesn't behave as expected

有人可以向我解释为什么以下测试程序会打印:

abcde

fghie

jklie

谎言

谎言

而不是:

abcde

fghie

jklie

mklie

mklie

节目是:

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
char buffer[16];
void main()
{
    int fd=open("bb",O_RDONLY);
    int i;
    for(i=5;i>0;i--)
    {
        read(fd,buffer,i);
        printf("%s\n",buffer);
    }
}

文件 bb 包含序列:abcdefghijklm

  1. 第一次迭代读取 "abcde",因此 buffer 包含 "abcde[=35=][=35=][=35=][=35=][=35=][=35=][=35=][=35=][=35=][=35=][=35=]" 和 fd 指向 'f'
  2. 第二次迭代读取 "fghi",因此 buffer 包含 "fghie[=37=][=37=][=37=][=37=][=37=][=37=][=37=][=37=][=37=][=37=][=37=]" 和 fd 指向 'j'
  3. 第三次迭代读取 "jkl",因此 buffer 包含 "jklie[=39=][=39=][=39=][=39=][=39=][=39=][=39=][=39=][=39=][=39=][=39=]" 和 fd 指向 'm'
  4. 第四次迭代读取"m\n",所以buffer包含"m\nlie[=41=][=41=][=41=][=41=][=41=][=41=][=41=][=41=][=41=][=41=][=41=]"并且fd在文件末尾
  5. 第五次迭代没有读取任何内容,因此 buffer
  6. 中没有任何变化

请注意,代码依赖于全局变量 buffer 被初始化为零。