我有一个嵌入式环境,用户可以在其中插入或移除 USB 闪存驱动器。我想知道驱动器是否已被移除,或者当我尝试写入驱动器时是否存在其他问题。但是,Linux 只是将信息保存在其缓冲区中并返回而没有指示错误。
我使用的计算机带有 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。我想出了如何让它自动安装驱动器(使用 REGISTER 事件),但是当我拉出内存时它似乎永远不会触发 UNREGISTER。
如何在我的程序中确定我是否已成功创建文件?
7 月 4 日更新:我没有检查 close() 的结果是一个愚蠢的疏忽。不幸的是,该文件可以正确关闭。所以这没有帮助。fsync() 呢?这听起来是个好主意,但也没有发现错误。
如果我有这样的东西,/sys 中可能会有一些有趣的信息。我相信直到 2.6 才添加。?
关于我的闪存驱动器质量的评论可能是有道理的。这是较早的之一。事实上,写保护开关现在似乎极为罕见。
我想我必须使用 overkill 选项:创建一个文件,卸载并重新安装驱动器,然后检查文件是否存在。如果这不能解决我的问题,那么事情就真的搞砸了!提醒自己:确保您尝试创建的文件不存在!
顺便说一句,这确实是一个 C++ 程序。您可以通过 .c_str() 来判断,为了简单起见,我打算将其编辑掉。