如何在 C++ 中检测 SD 卡存在 Linux
How to detect SD card presence in C++ In Linux
下午好,
我是运行一个简单的循环,用于检查是否插入或移除了SD卡,但它似乎并不总是正常工作。
问题是,当程序在插入 SD 卡的情况下启动时,if(f.good()) 语句是 True.
移除 SD 卡后,此语句为 False。
但是,当重新插入SD卡时,这个说法还是False。
在 C++ 中是否有更可靠的方法来检测 SD 卡是否存在?
我是 运行 Linux Yocto,基于 OpenEmbedded。
我宁愿避免使用任何外部库,并尽可能使用文件 IO 或系统调用。
谢谢。
我的循环如下所示,
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
这样的地方。该文件应该始终存在,并包含一个 unsigned long long
值。如果它是 0
那么没有媒体,如果它是 >0
那么你有那个尺寸的媒体。
bool has_media()
{
std::ifstream fsize("/sys/block/mmcblk1/size");
unsigned long long size;
return (fsize >> size) && (size > 0);
}
如果您想要适当的媒体通知而不是轮询和休眠 insertion/removal,并且您不想/不能使用 libudev,那么您将需要使用 uevent 和 netlink 套接字。请参阅此 excelent answer 和详细信息。
如果 SD 卡是唯一的 FAT32 分区,您可以简单地执行以下操作:
fdisk -l | grep FAT32 | cut -c 1-8
下午好,
我是运行一个简单的循环,用于检查是否插入或移除了SD卡,但它似乎并不总是正常工作。
问题是,当程序在插入 SD 卡的情况下启动时,if(f.good()) 语句是 True.
移除 SD 卡后,此语句为 False。
但是,当重新插入SD卡时,这个说法还是False。
在 C++ 中是否有更可靠的方法来检测 SD 卡是否存在? 我是 运行 Linux Yocto,基于 OpenEmbedded。 我宁愿避免使用任何外部库,并尽可能使用文件 IO 或系统调用。
谢谢。
我的循环如下所示,
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
这样的地方。该文件应该始终存在,并包含一个 unsigned long long
值。如果它是 0
那么没有媒体,如果它是 >0
那么你有那个尺寸的媒体。
bool has_media()
{
std::ifstream fsize("/sys/block/mmcblk1/size");
unsigned long long size;
return (fsize >> size) && (size > 0);
}
如果您想要适当的媒体通知而不是轮询和休眠 insertion/removal,并且您不想/不能使用 libudev,那么您将需要使用 uevent 和 netlink 套接字。请参阅此 excelent answer 和详细信息。
如果 SD 卡是唯一的 FAT32 分区,您可以简单地执行以下操作:
fdisk -l | grep FAT32 | cut -c 1-8