如何在 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