LVM 용 사용자 정의 잠금 라이브러리를 구현하려고합니다. lvm.conf에서 locking_type을 external (2)로 설정하고 필요한 기능을 구현하는 공유 라이브러리를 제공하는 것이 이론적으로는 간단하고 비교적 간단합니다.헤더에없는 공유 라이브러리/모듈 - 인수 구조체 구현
이 글에서는 LVM2의 소스 (특히 외부 잠금 메커니즘 구현)에 대해 알아 보았습니다.이 도구는 here입니다.
기본적으로, 무엇을 나는 다음과 같이 설명 헤더 기능을 구현하기 위해 수행되는 필요가 있다고 생각 :
static void (*_reset_fn) (void) = NULL;
static void (*_end_fn) (void) = NULL;
static int (*_lock_fn) (struct cmd_context * cmd, const char *resource, uint32_t flags) = NULL;
static int (*_init_fn) (int type, struct dm_config_tree * cft, uint32_t *flags) = NULL;
static int (*_lock_query_fn) (const char *resource, int *mode) = NULL;
이제 모든이 시점까지 복숭아. 그러나 _lock_fn 정의를 보면 첫 번째 인수로 struct cmd_context
에 대한 포인터가 필요합니다. 이 구조체는 LVM2 소스에서 쉽게 찾을 수 있지만 (상당히 복잡한 구조입니다!) API로 패키지에 노출 된 헤더 (예 : RHEL7의 lvm2-devel 패키지) 안에 있지 않습니다. 상상할 수 있듯이 구조체가 외부 라이브러리에 의해 사용되기로되어 있기 때문에 헤더에 있어야한다는 것이 중요합니다.
내가 잘못 생각한 것일까 아니면 단지 "버그"일까요? LVM2 개발자와상의해야합니까? 해당 구조체 및 내 프로젝트의 헤더 파일에 종속 된 다른 모든 형식을 복사/붙여 넣기 이외의 다른 해결 방법이 있습니까? 이 "임시 해결책"을 수행하면 GNU GPL 라이센스가 중단됩니다.
struct cmd_context;
이 그 이름을 가진 struct
이 있다는 C 컴파일러를 알려줍니다 :
또한 '불투명 포인터 유형'등에 대한 질문을 참조하십시오. 여기에서 사용중인 것으로 보입니다. 호출 코드가 구조의 내부에 대해 알 필요가 없거나 구조의 인스턴스를 로컬 또는 전역 변수로 할당 할 필요가 없을 때 좋은 생각입니다. 포인터만으로 충분하면 불투명 한 유형이 좋습니다. –