Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C+中检测SD卡的存在+;在Linux中_Linux_C++11_Yocto_Openembedded - Fatal编程技术网

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

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

下午好

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

了解可移动设备是否插入了介质的正确直接方法是从
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驱动器运行)上移除卡时会被删除。这个答案对我不起作用,尽管它确实有效。