2017-12-27 29 views
1

공유 메모리를 사용하여 여러 응용 프로그램에서 데이터를 저장하고 사용할 수 있다는 것을 알고 있습니다. 공유 포인터에 함수 포인터를 저장할 수 있습니까? 내 공유 객체에서 다른 응용 프로그램의 반환 값과 매개 변수가 동일한 함수로 돌아갑니다.함수 포인터를 공유 메모리에 저장하십시오.

+0

[공유 메모리 세그먼트 내의 포인터] 가능한 복제본 (https://stackoverflow.com/questions/10776762/pointers-inside-shared-memory-segment) – Aravind

+2

가능한 복제본 [여러 프로세스에서 함수 포인터를 사용할 수 있습니까? ?] (https://stackoverflow.com/questions/1561620/is-it-possible-to-use-function-pointers-across-processes) – Marc

+0

@Aravind는 함수 포인터가 아닌 데이터를 요청합니다. –

답변

2

번호는 어떻게 든 두 프로세스에서 동일한 주소에서로드 할 수있는 코드를 공유 메모리 영역으로 코드를로드하거나 발생하지 않는 한

, 함수 포인터가 유효하지 않습니다.

+0

모든 응용 프로그램에 내 공유 객체에 대한 액세스 권한이 있습니다. 그러나 각 응용 프로그램은 다른 .so 라이브러리 인스턴스를 얻습니다. – Black

+0

실제로 - ld.so는 프로그램/라이브러리가 프로세스에서로드되는 위치를 보장하지 않습니다. 나는 당신이 당신의 디자인을 재고해야한다고 생각합니다. –

+0

분명히 당신의 충고를 고려할 것입니다. ex.so에서 app1, app2 및 app3으로 데이터를 브로드 캐스트/멀티 캐스팅해야합니다. 이를 달성하기위한 더 나은 방법론을 제안 할 수 있습니까? – Black

0

당신이하고있는 일을 완전히 확신하지 못한다면, 공유 메모리 세그먼트에 함수 포인터를 저장하는 것은 나쁘다고 생각합니다. 프로세스가 권한이없는 함수 포인터에 액세스 할 수 있습니다. 결국 프로그램이 망가질 수 있습니다.

-1

당신이 원한다면 아니, 함수 포인터를 공유 할 수 없습니다, u는 그 함수의 라이브러리를 만들고 공유 라이브러리가 동일한 주소로로드 될 것이라고 보장 할 수 없습니다

0

프로세스에서 사용합니다 두 가지 다른 응용 프로그램. 더 나쁜 경우에, 주소 공간 레이아웃 무작위 화로 인해 임의의 임의의 주소에 라이브러리를로드 할 수 있습니다. 따라서 함수 포인터는 불변하지 않으므로 아무 곳에 나 저장할 수 없습니다.

솔루션으로 두 프로세스 모두에서 가능한 모든 콜백을 사용하여 함수 테이블을 만들고 공유 메모리의 함수에 오프셋을 저장할 수 있습니다. 확실히, 그 테이블은 정확히 동일해야합니다.