问题描述
虚拟机:VMware10.0.2 build-1744117
Linux :Ubuntu14.04.01
在Windows7中 通过Linux和Windows的共享文件夹使用notepad++编写C程序如下:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
char wbuf[] = "I love linux\nkkdud\n";
char buf[100] = {
0};
int ret = -1;
int fd = -1;
//打开文件
fd = open("a.txt", O_RDWR | O_APPEND);
if (-1 == fd)
{
printf("文件打开错误\n");
_exit(-1);
}
else
{
printf("文件打开成功,fd = %d\n", fd);
}
//读写文件
ret = write(fd, wbuf, strlen(wbuf));
if (ret < 0)
{
printf("write失败\n");
_exit(-1);
}
else
{
printf("实际写入%d字节\n", ret);
}
//关闭文件
close(fd);
return 0;
}
在Linux终端里
gcc a.c 生成a.out
touch a.txt
./a.out
I love linux
kkdud
在执行一次
./a.out
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@I love linux
kkdud
多次执行发现很多时候都是把原有的内容变成了乱码,写入的倒是没错。
测试现象
经过多次测试发现以下现象:
- 连续快速多次执行一般不会出错;
- 用notepad++打开 a.c和 a/txt 文件时出错几率大大增加;
- 不用notepad++打开也会出错,但几率不高;
- 在使用notepad++打开 a.c和a.txt 前提下在一次运行里多次打开文件写入不会出错;
- 只有在共享文件夹里多次执行一个这样的程序时会出错;
- 将a.c a.out a.txt 复制到非共享文件夹下执行不会发生错误。
正常执行结果
I love linux
kkdud
I love linux
kkdud
I love linux
kkdud
I love linux
kkdud
I love linux
kkdud
I love linux
kkdud
I love linux
kkdud
I love linux
kkdud
原因分析
是因为Windows和Linux在文档编辑上某些不一致造成的,而Ubuntu共享文件夹并没有对此做优化,以至于出现写入问题。