Я отлаживаю программу Qt, используя strace, и функция open () показывает, что:
open("../libPlayCtrl.so", O_RDONLY|O_CLOEXEC)
в случаях, когда он возвращается 3
кажется работает, но когда вернется 25
это не так, и libPlayCtrl.so
не загружен
Какая разница? И как я могу это исправить?
Файл .so является сторонней библиотекой. И не только этот, я также использую других 3-х библиотек, и они из того же продавца. Некоторые другие файлы lib получают свои open(...) = 3
и они, кажется, работают нормально.
РЕДАКТИРОВАТЬ:
ниже приведена часть вывода стриса,
из-за того, что я изменил конфигурацию, расположение .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`
Перейдите на страницу руководства для системного вызова open (), и вы найдете объяснение, что возвращаемое значение из open () — это номер нового открытого дескриптора файла.
Потратив немного больше времени на Google, вы наверняка найдете объяснение, что при открытии нового файла ядро назначает наименьший доступный, неиспользуемый дескриптор файла для открытого файла. Это все.
В заключение, не имеет значения, вернул ли open () 3 или 25, или 17, или 8. Все они указывают, что файл был успешно открыт, и ваше подозрение, что другое ненулевое значение указывает на проблему какого-то неверен.
Конечно, у вас может быть какая-то проблема с вашим приложением, но оно не имеет прямой связи с этим конкретным возвращаемым значением из open ().
Теперь сам факт, что иногда вы видите, что open () возвращает 3, а иногда 25, — это указывает на то, что есть несколько способов достичь этой конкретной точки при выполнении вашего приложения: либо без открытых файлов, кроме стандартного ввода, вывода и ошибка; или, по крайней мере, с 22 дополнительными файлами, уже открытыми. Вполне вероятно, что в последнем случае ваше приложение проделало гораздо более очевидную работу, включая открытие 22 или более файлов перед загрузкой этой библиотеки, и столкнулось с некоторой проблемой. Но сама проблема не имеет абсолютно никакого отношения к этому конкретному системному вызову.
Других решений пока нет …