2013-06-18 17 views
1

어떤 파일에 /sys/*static ssize_t sysfs_write_file(struct file *file, const char __user *buf, size_t count, loff_t *ppos)이라는 파일이 있는지 알고 싶습니다. 문제는 struct file *file을 가짐으로써 파일 이름/경로를 얻는 방법입니까?커널에 파일 *을 구조화하여 파일 이름을 얻는 방법은 무엇입니까?

struct file { 
    mode_t f_mode; 
    loff_t f_pos; 
    unsigned short f_flags; 
    unsigned short f_count; 
    unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin; 
    struct file *f_next, *f_prev; 
    int f_owner;   /* pid or -pgrp where SIGIO should be sent */ 
    struct inode * f_inode; 
    struct file_operations * f_op; 
    unsigned long f_version; 
    void *private_data; /* needed for tty driver, and maybe others */ 
}; 

편집 : 나는 거기에 이름 아이 노드 사이에 일대일 매핑이 없지만, 내가 메이저/마이너/파일 기술자를 알고 있어야하고 일부를 검색 할 수 있습니다 이해 inode의 이름을 파일 시스템에 저장합니다.

+0

당신의 이름을 무엇을해야합니까? –

답변

3

리눅스 및 기타 유닉스 계열 OS에서 파일 객체는 여러 개의 이름으로 가리킬 수 있으며 파일 객체 자체에는 포인터가 없습니다. 이름은 파일의 기능이 아니며 단지 외부 색인 일뿐입니다.

+0

파일 인 경우 메이저 및 마이너 파일을 가져올 수 있습니까? 파일 포인터에서 파일 시스템의 경로로 어떻게 다시 매핑 할 수 있습니까? – 0x90

+0

파일 포인터에는 장치 번호와 같은 데이터가 포함될 inode에 대한 포인터가 있습니다. 그러나 당신은 요점을 놓칩니다 : 열린 파일에는 이름이 없습니다. 그 이름 중 하나를 사용하여 이름을 알 수 있었을 지 모르지만 근본적으로 일방적 인 작업입니다. –

+0

나는 그 지점을 놓치지 않았다. 그러나 나의 질문은 어떻게 포인터에서 파일 시스템의 파일로 다시 매핑 할 수 있는가하는 것이다. – 0x90

2

파일을 여는 데 사용 된 파일 경로를 검색 할 수 있습니다. 리눅스에서 구조체 파일은 열린 파일을 나타내며 구조체와 관련된 파일을 여는 데 사용되는 경로가 있습니다. 2.6.20 이전에는 f_dentry라는 멤버 였고 2.6.20부터는 f_path라는 새로운 멤버입니다. 함수 d_path()를 사용하여 파일의 전체 경로를 직접 검색 할 수 있습니다.

다음과 같은 리눅스 소스 코드를 참조하십시오

http://lxr.free-electrons.com/source/include/linux/fs.h?v=3.10#L763

http://lxr.free-electrons.com/source/fs/dcache.c?v=3.0#L2626

또한 답변 : How can I get a filename from a file descriptor inside a kernel module?

+1

실제 코드는 struct 파일과 d_path()가 시간이 지남에 따라 변경되어 사용중인 커널 버전에 따라 다릅니다. 다른 질문의 코드를 참조로 참조 할 수 있습니다. 이미 struct 파일에 대한 포인터를 얻는 부분은 무시합니다. – logicor

관련 문제