Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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++ 打开原始磁盘并获取OS X的大小_C++_Macos_File Io_Disk - Fatal编程技术网

C++ 打开原始磁盘并获取OS X的大小

C++ 打开原始磁盘并获取OS X的大小,c++,macos,file-io,disk,C++,Macos,File Io,Disk,使用下面的代码,我能够成功地在我的机器上打开一个原始磁盘,但是当我得到磁盘长度时,每次都得到0 // Where "Path" is /dev/rdisk1 -- is rdisk1 versus disk1 the proper way to open a raw disk? Device = open(Path, O_RDWR); if (Device == -1) { throw xException("Error opening device"); } 使用这两种方法获取大小将

使用下面的代码,我能够成功地在我的机器上打开一个原始磁盘,但是当我得到磁盘长度时,每次都得到0

// Where "Path" is /dev/rdisk1 -- is rdisk1 versus disk1 the proper way to open a raw disk?
Device = open(Path, O_RDWR);
if (Device == -1)
{
    throw xException("Error opening device");
}
使用这两种方法获取大小将返回0:

struct stat st;

if (stat(Path, &st) == 0)
    _Length = st.st_size;
/

我对在非Windows平台上编程并不完全熟悉,所以请原谅任何看起来奇怪的事情。我的问题是:

  • 这是在OSX下打开原始磁盘的正确方法吗
  • 什么原因可能导致磁盘大小返回为0
  • 所讨论的磁盘是未格式化的磁盘,但对于那些希望从disk Utility获得信息的人(删除了不重要的内容):


    在搜索了一下
    ioctl
    请求代码之后,我发现了一些实际有效的东西

    #include <sys/disk.h>
    #include <sys/ioctl.h>
    #include <fcntl.h>
    
    int main()
    {
        // Open disk
        uint32_t dev = open("/dev/disk1", O_RDONLY);
    
        if (dev == -1) {
            perror("Failed to open disk");
            return -1;
        }
    
        uint64_t sector_count = 0;
        // Query the number of sectors on the disk
        ioctl(dev, DKIOCGETBLOCKCOUNT, &sector_count);
    
        uint32_t sector_size = 0;
        // Query the size of each sector
        ioctl(dev, DKIOCGETBLOCKSIZE, &sector_size);
    
        uint64_t disk_size = sector_count * sector_size;
        printf("%ld", disk_size);
        return 0;
    }
    
    #包括
    #包括
    #包括
    int main()
    {
    //开盘
    uint32_t dev=open(“/dev/disk1”,仅适用于此);
    如果(dev==-1){
    perror(“无法打开磁盘”);
    返回-1;
    }
    uint64扇区计数=0;
    //查询磁盘上的扇区数
    ioctl(开发、DKIOCGETBLOCKCOUNT和扇区计数);
    uint32扇区大小=0;
    //查询每个扇区的大小
    ioctl(开发、DKIOCGETBLOCKSIZE和扇区大小);
    uint64磁盘大小=扇区计数*扇区大小;
    printf(“%ld”,磁盘大小);
    返回0;
    }
    

    像这样的事情应该会奏效。我只是将我的代码复制到其中,所以我不确定它是否可以编译,但它应该可以。

    虽然是访问原始磁盘的好方法,但获得这样的大小可能不会如您所注意到的那样起作用(另外,您可能应该先尝试
    lseek64
    )。可能可以使用
    ioctl
    fcntl
    获取大小,否则您必须通过一些特殊的OSX特定函数获取信息。@JoachimPileborg我已经定义了(文件)偏移量(位64)。。。这些行为是否不一样?@JoachimPileborg doing:
    lseek(设备,0x7fffff-1,SEEK\u SET)
    实际上返回0x7fffffe,因此位被丢弃或者磁盘不支持
    lseek(…,0,SEEK\u END),但据我所知,他们应该。编辑:我不知道为什么我以前没有做
    lseek(设备,0xFFFFFFFF+5,SEEK\u SET)
    ,但是返回4,所以我假设位被删除了。好的。我今天出去了,意识到我今天的比赛还不是最棒的。0xFFFFFFFF+5由于位溢出(而不是将其强制转换为INT64)而生成4。当我直接搜索
    20003880960L
    时,我的应用程序输出“磁盘已成功打开。长度:0x4A8530000”。很抱歉造成这种混乱…@Lander:您愿意自己编辑或简单回答您的问题吗?实际上它不会这样工作-无符号int扇区至少需要无符号长,否则第一个ioctl将导致其他堆栈变量被破坏(“dev”使用默认编译器设置和正在探测的相当小的磁盘将写入零)更恰当地说,根据sys/disk中的数据结构,这些变量需要是uint64_t和uint32_t。h@Lander我正在尝试你的代码,但我总是在“打开”中出错,您知道原因是什么吗?@RuLoViC可能与此有关,或者您需要以root用户身份运行应用程序。映射错误代码将为您提供更好的想法。系统调用将设置
    errno
    ,然后您可以将其与值进行比较。解决SIP的正确方法是什么?我试图打开一个设备(外部USB磁盘),但即使作为root用户,MacOS(10.1.4.2)也不会给我访问权限。
    Name :  ST920217 AS Media
    Type :  Disk
    
    Partition Map Scheme :  Unformatted
    Disk Identifier      :  disk1
    Media Name           :  ST920217 AS Media
    Media Type           :  Generic
    Writable             :  Yes
    Total Capacity       :  20 GB (20,003,880,960 Bytes)
    Disk Number          :  1
    Partition Number     :  0
    
    #include <sys/disk.h>
    #include <sys/ioctl.h>
    #include <fcntl.h>
    
    int main()
    {
        // Open disk
        uint32_t dev = open("/dev/disk1", O_RDONLY);
    
        if (dev == -1) {
            perror("Failed to open disk");
            return -1;
        }
    
        uint64_t sector_count = 0;
        // Query the number of sectors on the disk
        ioctl(dev, DKIOCGETBLOCKCOUNT, &sector_count);
    
        uint32_t sector_size = 0;
        // Query the size of each sector
        ioctl(dev, DKIOCGETBLOCKSIZE, &sector_size);
    
        uint64_t disk_size = sector_count * sector_size;
        printf("%ld", disk_size);
        return 0;
    }