GNU Parted库以某种方式禁用分区打开

时间:2014-02-21 20:12:27

标签: linux ubuntu filesystems device

我曾经使用常规open调用打开磁盘分区:

int fd = open("/dev/sdb1", O_RDWR);

但是,当我的源代码中有多个Parted库调用时,open调用会返回No such file or directory错误,即使实际上没有调用这些Parted函数 。例如,下面的代码:

#include <fcntl.h>
#include <unistd.h>
#include <parted/parted.h>
#include <cerrno> 
#include <cstring>
#include <iostream>

void find()
{
  PedDevice* pdev = ped_device_get("/dev/sdb");
}

void Out(const std::string& S, int R)
{
  std::cout << S << "\t" << R << "\t" << std::strerror(errno) << std::endl;
}

int main()
{
  int fd = open("/dev/sdb1", O_RDWR);
  Out("Opening  ", fd);
  int res = close(fd);
  Out("Closing  ", res);
}

输出:

Opening     3   No such file or directory
Closing     0   No such file or directory

如果只是评论ped_device_get来电,那么程序将输出:

Opening     3   Success
Closing     0   Success

这里发生了什么?

(我使用的是Ubuntu 3.11.0-15,在MacBook Pro上的VMware Fusion 6.0.2中运行)

1 个答案:

答案 0 :(得分:0)

这实际上是StackOverflow的答案。但是因为我在那里投票支持移民......

发生的事情是你犯了一个新手错误:

  

open调用返回No such file or directory错误

不,它没有。它返回值3,您可以从程序输出中轻松看到。这并不意味着错误。值{0}也未从close()返回。

如果某个功能已指示已将其设置为,则仅检查并使用errno的值。如果open()返回-1,表示它已设置errno的值,则您可以合理地将宏的值解释为来自调用的错误。但既然没有,你就不能。

换句话说:这些函数在成功时不会重置 errno宏的值。他们只有设置失败时的值。

ENOENT错误来自先前失败的系统调用。 strace可能会告诉你在哪里。毫无疑问,在额外的库中链接会导致初始化代码在main()之前运行。