gpt4 book ai didi

c++ - open()返回结果码的区别: 25 vs 3?

转载 作者:行者123 更新时间:2023-11-30 02:33:19 25 4
gpt4 key购买 nike

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

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

在它返回 3 的情况下它似乎工作,但当它返回 25 时它没有,并且 libPlayCtrl.so 不是已加载。

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

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

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

编辑:

下面是strace输出的一部分,由于我更改了配置,.so文件的位置不同。成功的 .so 文件是供应商提供的更新版本的库。

成功案例:总共 15 个子句,最终找到 .so 文件。

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

程序显示来自库(可能是其他)的错误:“无法加载播放器 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`

最佳答案

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

在谷歌上花更多时间后,您一定会找到一个解释,即当打开一个新文件时,内核会为打开的文件分配最低可用的、未使用的文件描述符。就这样。

综上所述,无论open()返回3还是25,还是17,还是8,都没有关系,都说明文件打开成功,你怀疑是不同的非零值说明有问题有些种类不正确。

您的应用程序肯定会遇到某种问题,但它与 open() 的特定返回值没有任何直接关系。

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

关于c++ - open()返回结果码的区别: 25 vs 3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35591734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com