【问题标题】:How to detect SD card presence in C++ In Linux如何在 Linux 中用 C++ 检测 SD 卡的存在
【发布时间】:2016-02-23 20:58:04
【问题描述】:

下午好,

我正在运行一个简单的循环来检查 SD 卡是否已插入或移除,但它似乎并不总是正常工作。

问题是,当程序插入 SD 卡启动时,if(f.good()) 语句为 True。

当 SD 卡被移除时,此声明为 False。

但是,当重新插入 SD 卡时,这个说法仍然是False。

在 C++ 中有没有更可靠的方法来检测 SD 卡的存在? 我正在运行基于 OpenEmbedded 的 Linux Yocto。 我宁愿避免使用任何外部库,并尽可能使用文件 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));
    }

【问题讨论】:

  • 我认为当ifstream 变坏时(!好)它不会再变好。尽管ifstream f("/dev/mmcblk1") 在循环内,但它只被初始化一次。尝试在循环外声明 ifstream f 并在开始时执行 f.open("/dev/mmcblk1");` 并在完成所有检查后执行 f.close()。

标签: linux c++11 yocto openembedded


【解决方案1】:

了解可移动设备是否插入了媒体的正确直接方法是从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);
}

如果您想要正确通知媒体插入/移除,而不是轮询和休眠,并且您不想/不能使用 libudev,那么您需要使用 uevent 和 netlink 套接字。请参阅此excelent answer 了解详情。

【讨论】:

  • 谢谢,你的回答很好。我检查了我可以使用libudev,但它非常复杂,我还没有找到任何关于如何将它与SD卡一起使用的全面示例,除了在这里找到的另一个StackOverflow问题:stackoverflow.com/questions/10979123/…
  • @user2056201:是的,libudev 相当复杂,我没有经验。我所知道的是,您可以使用命令udevadm monitor,然后插入和移除您的媒体,看看会发生什么 uevent。
  • @user2056201:如果你可以使用 udisks2,它有一个非常好的 dbus 接口。如果没有,好吧,你可以研究它的源代码并了解它是如何工作的。
  • mmcblk 文件夹中的mmcblk 目录在 Raspbian Jessie 上移除卡时会被删除(从 USB 驱动器运行)。这个答案对我不起作用,尽管它确实编译了。
【解决方案2】:

如果 sd 卡是唯一的 FAT32 分区,您可以这样做:

fdisk -l | grep FAT32 | cut -c 1-8

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 2020-04-26
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    相关资源
    最近更新 更多