데몬 (deamon)에 의해 생성되는 스크립트 인터프리터가 있는데 항상 작동해야합니다. 즉, 다운 (충돌, 세그 폴트, 정상 종료 등)이 발생하면 데몬이이를 다시 생성합니다.dlopen 기반 응용 프로그램이 두 번째로 다르게 (오류가 있습니다) 실행됩니다.
이 해석기는 dlopen
(lib1
)을 사용하여 라이브러리를 동적으로 엽니 다. 이 라이브러리는 많은 다른 라이브러리 (lib2
, lib3
, ...)를 엽니 다. 그들 중 일부는 첫 번째 라이브러리를 참조합니다. 그래서 dlopen
호출에 RTLD_GLOBAL
및 RTLD_NOW
플래그를 사용하고 있습니다.
지금까지 모든 것이 잘 작동합니다.
인터프리터가 죽거나 충돌하여 다시 생성 될 때 문제가 발생합니다. dlopen을 다시 사용하면 문제가 없습니다 ... lib1
의 기능을 정상적으로 호출 할 수 있습니다. lib1
의 코드에서 나는 lib2
에서 함수를 호출합니다. 프로그램이 멈 춥니 다.
충돌이없는 것 같습니다 (segfault 또는 무언가). 호출 직전에 디버그 호출이 있고 함수의 첫 번째 줄에 다른 호출이 있습니다. 첫 번째가 실행됩니다. 두 번째는 그렇지 않습니다.
마지막 세부 사항 : lib1
은 실제로 개체 인스턴스를 반환하는 C++ 라이브러리입니다. lib1
에서 파괴자 방법을 생략하고 모든 모듈의 모든 헤더를 생략합니다. 누군가가 중요하다고 판단하면 더 많은 정보를 제공 할 수 있습니다.
어떤 일이 일어나고 있는지 알 수있는 사람이 있습니까? 나는이 문제를 의심
lib2_do_something() {
printf("Check point 2.\n");
return 1;
}
:
통역 :
Lib1_obj *instance;
void interpreter_start() {
// dlopen lib1
// get lib1_creator symbol.
instance = lib1_creator();
}
void interpreter_on_event_X() {
int x = instance->method1();
printf("x = %d\n", x);
}
LIB1 :
class Lib1_obj {
public:
int method1() {
printf("Check point 1.\n");
return lib2_do_something();
}
}
Lib1_obj * creator() {
return new Lib1_obj();
}
LIB2 시나리오를 ilustrate하기
은 "의사"코드를 고려 somet있다 프로세스가 종료되면 dlclose
으로 전화 할 수 없다는 사실과 관련이 있습니다. 그것이 dlopen 메커니즘을 엉망으로 만들 가능성이 있습니까?
대단히 감사합니다.
프로세스 내에서 _process_가 종료되었거나 세션이 일부 표시 되었습니까? – sarnold
프로세스가 종료되면 라이브러리가 자동으로 dlclose됩니다. 문제에 관해서는 - 당신이 두 번째로 올바르게 시작하는 문제에 집중하기로 결정한 동안, 나는 개인적으로 처음부터 충돌하지 않는 것에 집중할 것입니다. – mah
그게 문제 야. 저것을 부수 지 말라. directfb를 사용합니다. 그리고 나는 directfb를 정확하게 finiteize 할 수 없다.이 모듈에서는 작동하지 않지만 올바르게 닫을 수있는 유일한 방법은 프로세스를 강제 종료하는 것입니다. 프로세스를 종료해도 두 번째 실행시 다른 동작이 발생할 수 있습니다. – Marcus