Разница между кодом результата возврата из open (): 25 против 3?

Я отлаживаю программу Qt, используя strace, и функция open () показывает, что:

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

в случаях, когда он возвращается 3 кажется работает, но когда вернется 25 это не так, и libPlayCtrl.so не загружен

Какая разница? И как я могу это исправить?

Файл .so является сторонней библиотекой. И не только этот, я также использую других 3-х библиотек, и они из того же продавца. Некоторые другие файлы lib получают свои open(...) = 3и они, кажется, работают нормально.

  • Платформа: Ubuntu 12.04, 32bit.
  • Qt4.8
  • QtCreator 2.4.1
  • Компилятор: GCC

РЕДАКТИРОВАТЬ:

ниже приведена часть вывода стриса,
из-за того, что я изменил конфигурацию, расположение .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(не найдено). Как видите, на этот раз это стало 30 когда он наконец нашел .so файл.

И программа показала ошибку из библиотеки (может быть, другой): «Не удалось загрузить 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

Решение

Перейдите на страницу руководства для системного вызова open (), и вы найдете объяснение, что возвращаемое значение из open () — это номер нового открытого дескриптора файла.

Потратив немного больше времени на Google, вы наверняка найдете объяснение, что при открытии нового файла ядро ​​назначает наименьший доступный, неиспользуемый дескриптор файла для открытого файла. Это все.

В заключение, не имеет значения, вернул ли open () 3 или 25, или 17, или 8. Все они указывают, что файл был успешно открыт, и ваше подозрение, что другое ненулевое значение указывает на проблему какого-то неверен.

Конечно, у вас может быть какая-то проблема с вашим приложением, но оно не имеет прямой связи с этим конкретным возвращаемым значением из open ().

Теперь сам факт, что иногда вы видите, что open () возвращает 3, а иногда 25, — это указывает на то, что есть несколько способов достичь этой конкретной точки при выполнении вашего приложения: либо без открытых файлов, кроме стандартного ввода, вывода и ошибка; или, по крайней мере, с 22 дополнительными файлами, уже открытыми. Вполне вероятно, что в последнем случае ваше приложение проделало гораздо более очевидную работу, включая открытие 22 или более файлов перед загрузкой этой библиотеки, и столкнулось с некоторой проблемой. Но сама проблема не имеет абсолютно никакого отношения к этому конкретному системному вызову.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]