2013-07-06 3 views
3

리눅스 커널 모듈에는 unsigned int fd에서 파일 이름/경로를 가져 오는 방법이 있습니까?Linux 커널 모듈의 파일 설명자에서 파일 이름/경로를 가져 옵니까?

저는이 답변을 알고 있습니다 : How can I get a filename from a file descriptor inside a kernel module?하지만 코드를 올바르게 이해하면 struct files_struct도 필요합니다.

편집 :

가 아니므로 중복으로 투표를 중지하십시오. 나는 시스템 모듈을 사용하지 않고 커널 모듈에서 평범한 C로 파일의 이름/경로를 얻는 방법을 요구하고있다. 다른 말로하면 :/procself/fd /에서 readlink를 실행하는 것은 이 아니라입니다.

편집 2 :

는 커널의 시스템 콜은 ssize_t read(int fd, void *buf, size_t count); 3 개 인수, 그 중 하나가 FD되는 소요 읽어 보시기 바랍니다. 어떻게 든 read은 (inode 내부의 모든 파일 대신) 단일 파일에서 읽을 수 있다는 것은 명백합니다. 문제는 방법입니다.

+0

하드 링크의 경우 파일에 여러 경로가있을 수 있습니다. 어떻게하면 올바른 경로를 찾았는지 알 수 있습니까? –

+0

[C의 파일 설명자에서 파일 이름 가져 오기] 가능한 복제본 (http://stackoverflow.com/questions/1188757/getting-filename-from-file-descriptor-in-c) –

+0

@CarlNorum 아마도 이것은 반환함으로써 회피 될 수 있습니다. 캐릭터 라인의 배열 –

답변

3

참조하는 질문에 대한 답의 코드는 필요한 작업입니다. 그리고 예, struct files_struct은 작업에서 필요합니다. 파일 설명자가 files_struct 컨텍스트에서만 의미가 있기 때문에 (일반적으로 프로세스 당 하나가 있습니다). 그것들은 전 세계적으로 고유하지 않으며, 개별 열린 파일 테이블 내의 인덱스입니다.

코드가 프로세스 컨텍스트 (예 : 시스템 호출을 통해 호출 됨)에서 실행 중이면 current->files을 현재 작업의 files_struct으로 사용할 수 있습니다. 이것은 read()입니다.

+0

저도 시스템 콜에서 실행하고 있습니다. 그렇습니다. 현재 파일을 얻을 수 있습니다. 그게 내가 몇 시간의 독서 후에 얻은 것이지만, 나는 정말로 내가 원하는 것 대신에 쓰레기를 얻는다. 오류가 어디 있습니까? http://pastebin.com/RNrGRVsC – alexandernst

+0

@alexandernst : 올바른 잠금/rcu 역 참조를 수행하지 않고'qstr-> len'을 무시하고 경로의 마지막 요소에만 액세스합니다. http://stackoverflow.com/a/8250940/134633과 같이 도우미 함수를 사용하십시오. – caf

+0

답장하는 데 너무 오래 걸려서 죄송합니다. 그 다른 질문에 대한 당신의 대답은 참으로 효과가있었습니다. 나는 올바른 방법으로 행동하지 않았습니다. 내 기능은 다음과 같습니다. http://pastebin.com/707W1JDR 저의 작은 질문이 하나 있습니다. 나는 path_from_fd가 반환하는 것을 kfree 할 필요가 없다, 맞습니까? – alexandernst

관련 문제