如何在C+中检测SD卡的存在+;在Linux中
下午好 我正在运行一个简单的循环来检查SD卡是否已插入或移除,但它似乎并没有一直正常工作 问题是,当程序在插入SD卡的情况下启动时,if(f.good())语句是True 卸下SD卡时,此语句为False 但是,当重新插入SD卡时,此语句仍然是False 在C++中有更可靠的方法来检测SD卡的存在吗? 我正在运行基于OpenEmbedded的Linux Yocto。 我宁愿避免使用任何外部库,如果可能的话,使用文件IO或系统调用 谢谢 我的循环如下所示如何在C+中检测SD卡的存在+;在Linux中,linux,c++11,yocto,openembedded,Linux,C++11,Yocto,Openembedded,下午好 我正在运行一个简单的循环来检查SD卡是否已插入或移除,但它似乎并没有一直正常工作 问题是,当程序在插入SD卡的情况下启动时,if(f.good())语句是True 卸下SD卡时,此语句为False 但是,当重新插入SD卡时,此语句仍然是False 在C++中有更可靠的方法来检测SD卡的存在吗? 我正在运行基于OpenEmbedded的Linux Yocto。 我宁愿避免使用任何外部库,如果可能的话,使用文件IO或系统调用 谢谢 我的循环如下所示 while (running)
while (running)
{
ifstream f("/dev/mmcblk1");
if (f.good()) {
f.close();
if (!mounted)
{
system("mount /dev/mmcblk1p1 /mnt/Storage");
mounted = true;
}
sdPresent = true;
}
else {
f.close();
sdPresent = false;
mounted = false;
}
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
了解可移动设备是否插入了介质的正确直接方法是从
sysfs
读取设备大小
在您的情况下,它可能类似于/sys/block/mmcblk1/size
。该文件应始终存在,并包含一个无符号long
值。如果是0
,则没有介质;如果是>0
,则有一个相同大小的介质
bool has_media()
{
std::ifstream fsize("/sys/block/mmcblk1/size");
unsigned long long size;
return (fsize >> size) && (size > 0);
}
如果您不需要轮询和睡眠,而是需要正确的媒体插入/删除通知,并且不想/不能使用libudev,那么您需要使用uevent和netlink套接字。详细信息见此。如果sd卡是唯一的FAT32分区,您只需执行以下操作:
fdisk -l | grep FAT32 | cut -c 1-8
我认为当一个
ifstream
坏了(!好)就不会再好了。尽管ifstream f(“/dev/mmcblk1”)
在循环中,但它只初始化了一次。尝试在循环外声明ifstream f
,并执行f.open(“/dev/mmcblk1”);`在开始和完成所有检查时关闭()。谢谢,你的答案很好。我检查过我可以使用libudev,但是它非常复杂,我还没有找到任何关于如何在Sd卡上使用它的全面例子,除了在这里发现的另一个StackOverflow问题:@user2056201:是的,libudev非常复杂,我没有经验。我所知道的是,您可以使用命令udevadm monitor
,然后插入和删除您的媒体,并查看预期的事件。@user2056201:如果您可以使用udisks2,它有一个非常好的dbus界面。如果没有,那么,您可以研究它的源代码并了解它的工作原理。mmcblk
文件夹中的目录在Raspbian Jessie(从USB驱动器运行)上移除卡时会被删除。这个答案对我不起作用,尽管它确实有效。