我使用的计算机配备了2.4.26内核和libc 2.3.2。
我是这样挂载驱动器的:
i = mount(MEMORY_DEV_PATH, MEMORY_MNT_PATH, "vfat", MS_SYNCHRONOUS, NULL);
这样可以正常工作:
50:/root # mount
/dev/scsi/host0/bus0/target0/lun0/part1 on /mem type vfat (rw,sync)
50:/root #
稍后,我尝试将文件复制到它上面:
int ifile, ofile;
ifile = open("/tmp/tmpmidi.mid", O_RDONLY);
if (ifile < 0)
{
perror("open in");
break;
}
ofile = open(current_file_name.c_str(), O_WRONLY | O_SYNC);
if (ofile < 0)
{
perror("open out");
break;
}
#define BUFSZ 256
char buffer[BUFSZ];
while (1)
{
i = read(ifile, buffer, BUFSZ);
if (i < 0)
{
perror("read");
break;
}
j = write(ofile, buffer, i);
if (j < 0)
{
perror("write");
break;
}
if (i != j)
{
perror("Sizes wrong");
break;
}
if (i < BUFSZ)
{
printf("Copy is finished, I hope\n");
close(ifile);
close(ofile);
break;
}
}
如果使用一个写保护的USB存储器执行这段代码,则结果为:
Copy is finished, I hope
在控制台上,内核不断发出错误消息。我相信,如果我只是拔掉了USB驱动器(而没有卸载它),同样的事情也会发生。
我还尝试过调整devfs。我找到了如何使用注册事件自动挂载驱动器的方法,但似乎从未触发注销事件,当我拔出存储设备时。
如何在我的程序中确定我是否成功创建了一个文件?
7月4日更新:
我犯了一个愚蠢的错误,没有检查close()的结果。不幸的是,文件可以在没有错误的情况下关闭。所以这并没有帮助。那么fsync()呢?听起来很好,但它也没有捕捉到错误。
如果我有/sys文件,可能会有一些有趣的信息。我相信直到2.6.?,才会添加这个文件。
关于我的闪存驱动器质量的评论可能是有道理的。它是早期的产品之一。实际上,写保护开关现在似乎非常少见。
我认为我必须使用最彻底的选项:创建一个文件,卸载和重新挂载驱动器,并检查文件是否存在。如果这不能解决我的问题,那么肯定有什么问题!提醒自己:确保你尝试创建的文件不存在!
顺便说一句,这确实是一个C++程序。你可以通过我本来想简化的.c_str()看出来。
fopen
,fread
,fwrite
等)而不是POSIX函数吗? - Emile Cormier