我曾经使用常规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中运行)
答案 0 :(得分:0)
这实际上是StackOverflow的答案。但是因为我在那里投票支持移民......
发生的事情是你犯了一个新手错误:
open
调用返回No such file or directory
错误
不,它没有。它返回值3,您可以从程序输出中轻松看到。这并不意味着错误。值{0}也未从close()
返回。
如果某个功能已指示已将其设置为,则仅检查并使用errno
宏的值。如果open()
返回-1,表示它已设置errno
的值,则您可以合理地将宏的值解释为来自调用的错误。但既然没有,你就不能。
换句话说:这些函数在成功时不会重置 errno
宏的值。他们只有设置失败时的值。
ENOENT
错误来自先前失败的系统调用。 strace
可能会告诉你在哪里。毫无疑问,在额外的库中链接会导致初始化代码在main()
之前运行。