代码: 全选
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#define SEC_SIZE 0x200
typedef unsigned char u8;
typedef unsigned int u32;
int main(int argc, char* argv[])
{
int ret = -1;
int in, out;
u8 buf[SEC_SIZE];
in = open("in.bin", O_WRONLY);
if(in < 0)
{
printf("file in.bin open failed!\n");
goto exit0;
}
out = open("out.bin", O_RDONLY);
if(out < 0)
{
printf("file out.bin open failed!\n");
goto exit1;
}
ret = read(out, buf, SEC_SIZE);
if(ret ^ SEC_SIZE)
{
printf("read error!\n");
goto exit2;
}
ret = write(in, buf, SEC_SIZE);
if(ret ^ SEC_SIZE)
{
printf("write error!\n");
goto exit2;
}
exit2:
close(out);
exit1:
close(in);
exit0:
return (ret < 0) ? -1 : 0;
}
编译: gcc -m32 -o app main.c
说明:64位环境编译32位应用程序,需要先:apt-get install gcc-multilib
事先准备2个文件:
out.bin,512字节
in.bin,520字节且最后几个字节不是 0x00
运行完之后,发现in.bin的513 ~ 520字节全部变成0x00
我使用 fopen()-fread()-fwrite()-fclose()这种API测试,结果一样的!
更奇怪的是:
同样的代码,同样的编译方法,在之前的ubuntu 12.04 64位,gcc 4.6.3版本里面,运行结果是正常的,不会修改512字节之后的内容