C에서 파일 설명자 (Linux)의 파일 이름을 가져올 수 있습니까?
C에서 파일 설명자 (Linux)의 파일 이름을 가져올 수 있습니까?
답변:
당신은 사용할 수 있습니다 readlink
에 /proc/self/fd/NNN
NNN은 파일 기술자입니다. 이렇게하면 파일을 열었을 때의 파일 이름이 제공됩니다. 그러나 그 이후로 파일이 이동되거나 삭제 된 경우 더 이상 정확하지 않을 수 있습니다 (일부 경우 Linux에서 이름 변경을 추적 할 수 있음). 확인하려면, stat
파일 이름이 주어 fstat
은 당신이하고 있는지 확인 전략 중 st_dev
과 st_ino
동일합니다.
물론 모든 파일 설명자가 파일을 참조하는 것은 아니며, pipe:[1538488]
. 실제 파일 이름은 모두 절대 경로이므로 어느 것이 충분한 지 쉽게 결정할 수 있습니다. 또한 다른 사람들이 언급했듯이 파일에는 파일을 가리키는 여러 개의 하드 링크가있을 수 있습니다. 이것은 파일이 열린 파일 만보고합니다. 주어진 파일의 모든 이름을 찾으려면 전체 파일 시스템을 탐색하면됩니다.
fd
것은 그러한 참조가 됨) inode 번호 를 재사용 할 수 없습니다 . 파일을 닫은 후 또는 열기 전에 inode 번호를 사용하는 모든 소프트웨어는 본질적으로 경쟁 조건의 영향을받습니다.
setuid()
트릭을 사용하면 /proc/self/fd
프로세스에서 액세스 할 수 없을 수도 있습니다. 참조 : permalink.gmane.org/gmane.linux.kernel/1302546
Mac OS X에서이 문제가 발생했습니다. /proc
가상 파일 시스템이 없으므로 허용 된 솔루션이 작동하지 않습니다.
대신 다음 F_GETPATH
명령이 있습니다 fcntl
.
F_GETPATH Get the path of the file descriptor Fildes. The argu-
ment must be a buffer of size MAXPATHLEN or greater.
따라서 파일 설명자에 연결된 파일을 가져 오려면 다음 코드 조각을 사용할 수 있습니다.
#include <sys/syslimits.h>
#include <fcntl.h>
char filePath[PATH_MAX];
if (fcntl(fd, F_GETPATH, filePath) != -1)
{
// do something with the file path
}
MAXPATHLEN
정의 된 위치를 기억하지 못하기 때문에 PATH_MAX
syslimits에서 괜찮을 것이라고 생각 했습니다.
getsockname
.
Windows에서 GetFileInformationByHandleEx 를 사용하여 FileNameInfo를 전달 하면 파일 이름을 검색 할 수 있습니다.
Tyler가 지적했듯이 주어진 FD는 0 개의 파일 이름 (다양한 경우) 또는> 1 (여러 개의 "하드 링크"가 후자의 상황이 일반적으로 설명되는 방식에 해당 할 수 있기 때문에 "직접적이고 안정적으로"필요한 작업을 수행 할 수있는 방법이 없습니다.) ). 모든 제한이있는 기능이 여전히 필요한 경우 (속도 및 1이 아닌 0, 2, ... 결과를 얻을 수있는 가능성) 다음과 같이 할 수 있습니다. 첫째, FD를 fstat- 이것은 알려줍니다. , 그 결과 struct stat
파일이 어떤 장치에 있는지, 얼마나 많은 하드 링크가 있는지, 특수 파일인지 여부 등이 이미 귀하의 질문에 답할 수 있습니다. 예를 들어 하드 링크가 0 개인 경우 실제로 해당 파일 이름이 없음을 알 수 있습니다. 디스크에.
통계가 희망을 준다면 모든 하드 링크를 찾을 때까지 관련 장치에있는 디렉토리의 "트리를 걸어야"합니다 (또는 둘 이상이 필요하지 않은 경우에는 첫 번째 링크 만 가능합니다. ). 그 목적을 위해 readdir (물론 opendir & c) struct dirent
을 사용하여 원래의 inode 번호와 동일한 inode 번호를받을 때까지 반복적으로 하위 디렉토리를 엽니 다 struct stat
(이름이 아닌 전체 경로를 원하는 경우, 재구성하려면 디렉토리 체인을 뒤로 걸어야합니다.)
이 일반적인 접근 방식이 허용되지만 더 자세한 C 코드가 필요하면 작성하기가 어렵지 않을 것입니다 (쓸모없는 경우 작성하지 않을 것입니다. 즉, 필연적으로 느린 성능 또는 응용 프로그램의 목적에 따라! = 1 개의 결과를 얻을 가능성 ;-).
불가능한. 파일 디스크립터는 파일 시스템에서 여러 이름을 가질 수 있거나 이름이 전혀 없을 수 있습니다.
편집 : OS를 지정하지 않았기 때문에 OS 별 API가없는 평범한 오래된 POSIX 시스템에 대해 이야기하고 있다고 가정합니다.