구조체에 대한 인스턴스를 왜 말씀하신 건지는 모르겠지만, 주어진 코드는 함수 포인터 선언입니다.
매개변수를 3개 (struct inode *, struct dentry *, unsignedint) 받아서 struct dentry *를 반환하는 함수에 대한 포인터요.
사실 위 코드는 struct inode_operations의 필드 선언인데, 이 구조체의 역할은 각 파일 시스템 구현에서 자기 파일 시스템의 inode를 다루는 일련의 함수들을 지정할 수 있도록 함수 포인터 인터페이스를 제공하는 것입니다. 혹시 OOP를 공부하셨다면 virtual function을 연상하시면 이해가 빠르실 겁니다. 결과적으로, lookup을 호출할 때 실제로 호출되는 함수는 각 파일 시스템 구현에서 제공하는 것이죠.
코드를 읽을 땐 함수 포인터와 같은 동적인 정보들을 알 수가 없으므로 난처한 경우가 종종 있습니다만 이 경우는 별 거 아닙니다. 일단 파일 시스템이 어떤 것인지 파악하고, 그 파일 시스템 구현에서 struct inode_operations 인스턴스를 어떻게 채우는지 찾아보면 되니까요. 예컨대 ext4라고 하면:
lookup이라는 이름의 function
lookup이라는 이름의 function pointer인 것 같네요.
* 반환 타입은 struct dentry *
* 입력 타입은 struct inode *,struct dentry *, unsigned int
구조체에 대한 인스턴스를 왜 말씀하신 건지는
구조체에 대한 인스턴스를 왜 말씀하신 건지는 모르겠지만, 주어진 코드는 함수 포인터 선언입니다.
매개변수를 3개 (
struct inode *
,struct dentry *
,unsigned int
) 받아서struct dentry *
를 반환하는 함수에 대한 포인터요.사실 위 코드는
struct inode_operations
의 필드 선언인데, 이 구조체의 역할은 각 파일 시스템 구현에서 자기 파일 시스템의 inode를 다루는 일련의 함수들을 지정할 수 있도록 함수 포인터 인터페이스를 제공하는 것입니다. 혹시 OOP를 공부하셨다면 virtual function을 연상하시면 이해가 빠르실 겁니다. 결과적으로, lookup을 호출할 때 실제로 호출되는 함수는 각 파일 시스템 구현에서 제공하는 것이죠.코드를 읽을 땐 함수 포인터와 같은 동적인 정보들을 알 수가 없으므로 난처한 경우가 종종 있습니다만 이 경우는 별 거 아닙니다. 일단 파일 시스템이 어떤 것인지 파악하고, 그 파일 시스템 구현에서
struct inode_operations
인스턴스를 어떻게 채우는지 찾아보면 되니까요. 예컨대 ext4라고 하면:http://elixir.free-electrons.com/linux/v4.13.4/source/fs/ext4/namei.c#L3880
오호, ext4_lookup로군요. 그걸 찾아보면:
http://elixir.free-electrons.com/linux/v4.13.4/source/fs/ext4/namei.c#L1536
댓글 달기