Linux文件操作测试程序无法正常运行

时间:2018-11-01 18:04:05

标签: c linux system-calls

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

abcde

fghie

jklie

m

谎言

m

谎言

代替:

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 个答案:

答案 0 :(得分:3)

  1. 第一次迭代读取“ abcde”,因此buffer包含“ abcde \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0”和fd点在“ f”处
  2. 第二次迭代读取“ fghi”,因此buffer包含“ fghie \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0”和fd点在“ j”处
  3. 第三次迭代读取“ jkl”,因此buffer包含“ jklie \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0”和fd点位于'm'
  4. 第四次迭代读取“ m \ n”,因此buffer包含“ m \ nlie \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0”和{{ 1}}位于文件末尾
  5. 第五次迭代不读取任何内容,因此fd中没有任何变化

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