返回结果代码与open()的区别:25 vs 3?

时间:2016-02-24 01:42:07

标签: c++ qt strace

我正在使用strace调试Qt程序,而open()函数显示:

open("../libPlayCtrl.so", O_RDONLY|O_CLOEXEC)

在它返回3的情况下似乎有效,但当它返回25时却没有,并且libPlayCtrl.so未加载。

区别是什么?我该如何解决?

.so文件是第三方库。不仅是这个,我还使用其他第三个库,他们来自同一个供应商。其他一些lib文件获得了open(...) = 3,它们似乎工作正常。

  • 平台:Ubuntu 12.04,32位。
  • Qt4.8
  • QtCreator 2.4.1
  • 编译:GCC

修改

下面的

是strace输出的一部分, 由于我改变了配置,.so文件的位置是不同的。并且成功的.so文件是来自供应商的更新版本的lib。

成功案例: 在最终找到.so文件之前总共有15个条款。

open("../lib/tls/i686/sse2/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/tls/i686/sse2/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/tls/i686/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/tls/i686/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/tls/sse2/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/tls/sse2/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/tls/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/tls/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/i686/sse2/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/i686/sse2/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/i686/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/i686/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/sse2/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/sse2/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("../lib/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = 3

失败案例: 省略号表示大约有95个open()子句都等于-1(未找到)。正如你所看到的那样,它最终找到.so文件后变为30

程序显示lib(或其他)的错误:" 无法加载播放器SDK "。

.....
21:02:33 open("./sse2/cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
21:02:33 open("./sse2/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
21:02:33 open("./cmov/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
21:02:33 open("./libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
21:02:33 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 30
21:02:33 open("/.../.../.../RemoteClient/lib/libPlayCtrl.so", O_RDONLY|O_CLOEXEC) = 30`

1 个答案:

答案 0 :(得分:3)

转到open()系统调用的手册页,您会发现open()的返回值是新打开的文件描述符的编号。

在Google投入更多时间之后,您肯定会找到一个解释,即在打开新文件时,内核会将最低的可用未使用文件描述符分配给打开的文件。这就是全部。

总之,open()返回3或25,或17还是8并不重要。它们都表明文件已成功打开,并且您怀疑不同的非零值表示某种问题是不正确的。

您的应用程序当然可能存在某种问题,但它与open()的特定返回值没有任何直接关系。

现在,事实本身有时你会看到open()返回3,有时是25 - 这表明在应用程序执行中有多种方法可以达到这个特定点:没有文件打开,除了标准输入,输出和错误;或者已经打开了至少22个其他文件。完全合理的是,在后一种情况下,您的应用程序执行了更明显的工作,涉及在加载此库之前打开22个或更多文件,并遇到某种问题。但实际问题本身与这个特定的系统调用完全无关。