如何在C ++中检测SD卡存在在Linux中

时间:2016-02-23 20:58:05

标签: linux c++11 yocto openembedded

下午好,

我正在运行一个简单的循环来检查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));
    }

2 个答案:

答案 0 :(得分:3)

了解可移动设备是否插入媒体的正确直接方法是从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并附上详细信息。

答案 1 :(得分:0)

如果sd卡是唯一的FAT32分区,则只需执行以下操作:

window.bootstrap = require('bootstrap/dist/js/bootstrap.bundle.js');