2014-05-13 8 views
1

로깅 라이브러리 liblog.so을 만들었습니다. File *rt_file이라는 변수를 공유하고 싶습니다.이 변수는 lib_rt.h에 정의되어 있으며이 헤더는 log_rt.c,log_linux.c ==> liblog.so, logd.c ==> logdlog_rt_client.c ==> log_rt_client으로 상속됩니다. 여기서 나는 데몬을 만들었습니다 logd (실제해야합니다) file pointerrt_file.동적 라이브러리에 공유 변수 설정

그게 내가하고 싶은 일입니다. 여기 liblog.so은 동적 인 libarary입니다. 부팅시에 logd이 시작되고 파일 포인터를 rt_filelog_rt_client으로 설정하여 파일 포인터를 가져와 일부 로그를 인쇄해야합니다.

공통 변수 rt_file을 공유하는 데 문제가 있습니다. 나는 다른 제안을 제안했다.

stackoverflow [1] : 첫 번째 해결책은 extern을 사용하여 작업을 완료하는 것이 었습니다. 내 상황에 대한 비록 [2]에 대한이. 전역 변수를 작성하는 대신 변수를 범위 파일에 넣고 getset 함수를 사용하여 값에 액세스하십시오.

하지만 두 가지 옵션이 모두 나를 위해 효과가 없었습니다. 설명해 드리겠습니다.

  1. 나는 log_rt_clientrt_file의 선언을했지만,이 logd에 정의되어 있기 때문에 정의되지 않은 경우 별도로 그래서, 그것은 오류를 보여주는 된 모든 파일 liblog.sologdlog_rt_client을 컴파일 (해야한다). 그것은 log_rt_client으로 컴파일되지 않았습니다. 모든 파일이 내가 두 번째 옵션을 시도했을 때 liblog.so
  2. 에 연결되어 있지만, 결과는 liblog.so 세트의에 logd 호출은, 예상치 못한이었고, 파일 포인터의 얻을하지만 난 log_rt_clientrt_file이 예상 포인터 (파일 포인터)를 가지고하지 않습니다 실행했을 때. 두 가지 모두에 대한 rt_file의 평균 할당은 다릅니다.

어느 것이 나에게 해결책을 제시 할 수 있습니까? 희망이 모든 것을 설명합니다.

답변

0

당신은 공유 메모리를 사용할 필요가

동적 LIB는 프로세스 주소 공간에 매핑되고, 그래서 각 프로세스 rt_file의 내가 전역 변수를 의미한다 (데이터 세그먼트에 매핑 자신의 사본을 볼 수

. 귀하의 경우에는 rt_file).