【问题标题】:Using open() on a thumb drive在拇指驱动器上使用 open()
【发布时间】:2014-04-23 05:10:37
【问题描述】:

我的 USB 拇指驱动器上有一个 EXT2 分区,我无法让 C 函数 open() 返回 -1 以外的任何内容。

分区管理器说分区位于 /dev/sdb2 而我的代码说

int fd = open("/dev/sdb2", O_RDONLY);

但调试后,(fd == -1) 和我的 USB 通知程序说它之前或之后没有安装。

旁注:超级块和引导部分似乎填充了值...

【问题讨论】:

  • 打开失败后errno的值是多少? (你知道open 不会挂载那个分区,对吧?它会尝试直接打开块设备,允许你直接读/写到原始磁盘 - 非常危险 - 如果你有正确的权限)
  • 是的,我解释得不够好(我知道打开的目的)。如何找到 errno?
  • #include <errno.h>#include <stdio.h>,然后在openif (fd == -1) { perror("open failed"); exit(1); } 或只是printf errno(它是一个整数)之后。
  • @Mat 我使用了printf("%s\n", strerror(errno)); 并得到了权限被拒绝我如何授予权限?
  • 检查/dev/sdb2 的权限并使用具有适当权限的用户(可能:root)运行您的代码,或者更改设备上的权限。 警告这很危险。

标签: c file-io filesystems ext2


【解决方案1】:

打开/dev/sdb2 将打开访问拇指驱动器上分区的原始块设备,如果分区上有文件系统,这根本不是你想要做的。您需要先挂载文件系统,然后才能通过挂载点访问其中的文件。大多数 linux 系统会在你插入拇指驱动器时自动挂载它——如果你在命令行输入mount,它会显示所有挂载的文件系统以及它们的挂载位置。这可能会显示如下一行:

/dev/sdb2 on /media/usb type ext2 (...

在这种情况下,您打开/media/usb/file 以访问拇指驱动器上文件系统根目录中的file

如果它没有自动挂载,您需要在访问它之前手动挂载它——您可以使用mount 程序或程序中的 mount(2) 系统调用来实现,但它通常需要超级用户权限。

无论您如何安装它,请务必在拔下 U 盘之前先卸载它,以确保所有数据都已写入并且是最新的。

【讨论】:

  • 感谢您的回复,但我正在编写一个程序来访问和修改inode。这需要open()read(),Mat 是对的,因为我需要检查我的 errno 并采取相应措施。
【解决方案2】:

在我的问题中打开 U 盘的代码是正确的,但程序要么需要以超级用户身份运行,要么需要以 chmod 777 /dev/sdb2 运行

要查看这是否是您的问题,请使用上面的代码printf("Error: %s\n", strerror(errno));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多