파일을 열기위해 open()시스템콜을 사용하여 file descriptor를 얻느다.
반대로 fd를 가지고 있는데 파일의 위치를 알고 싶은 경우가 있다.
리눅스에서 이것을 할 수 있는 방법을 /proc파일시스템의 노드를 통해서 제공하고 있다.

일단 symbolic link에 대해 알아야 한다.

fd2path_1.png


ln이라는 커맨드를 통해서 a.txt에 대한 심볼릭링크 b.txt를 만들었다.
b.txt를 열어서 보면 그 내용은 항상 a.txt가 된다. 간단히말해서 b.txt는 a.txt의 별명이다.
ls커맨드로 디렉토리의 파일목록을 보면 '->'로 b.txt가 a.txt를 가리키고 있는 것을 볼 수 있다.
또한 파일의특성에 표시되는 데 b.txt에 해당하는 줄의 첫번째 칼럼에 'l', 즉 'link'라고 표시되어
있는 것을 볼 수 있다.

fd2path_2.png


리눅스API중에 readlink()함수는 심볼릭링크('b.txt')가 가리키는 파일('a.txt')를 얻을 수 있게 해 준다.

fd2path_3.png


fd로부터 파일패스를 얻기위해 './a.txt'파일을 open()을 사용해서 열어본다.

fd2path_4.png


열려진 fd에 해당하는 파일에 대한 심볼릭링크는 "/proc/<pid>/fd/<fd>"이다.
이 파일을 readlink()의 입력파라메터로 주면 원하는 파일패스가 나온다.


fd2path_5.png


test_fd_path(소스코드첨부)를 실행시키면, 다음과 같은 출력이 나오며,
fd(==3)에 대한 파일패스 '/home/hsheun/a.txt'를 얻을 수 있다.
다음과 같은 절자로 원하는 파일패스를 얻을 수 있다.

fd2path_6.png