/dev/fd/3에는 뭔가 특별한 것이 있습니다

/dev/fd/3에는 뭔가 특별한 것이 있습니다

나는 파일 설명자를 이해하려고 노력해 왔습니다. "ls -l /dev/fd/"를 입력하면 다음과 같은 메시지가 나타납니다.

lrwx------ 1 me users 64 May  2 16:02 0 -> /dev/pts/5
l-wx------ 1 me users 64 May  2 16:02 1 -> /home/me/file
lrwx------ 1 me users 64 May  2 16:02 2 -> /dev/pts/5
lr-x------ 1 me users 64 May  2 16:02 3 -> /proc/31518/fd

/dev/fd/3은 현재 프로세스를 가리키는 것 같습니다. 그러나 나는 다음과 같은 파일 설명자의 해석을 보았습니다. http://www.tldp.org/LDP/abs/html/io-redirection.html, /dev/fd/3이 특별한 것이라고 말하지 마십시오(그리고 N > 3인 /dev/fd/N과 같다는 것을 암시하십시오). 여기서 무슨 일이 일어나고 있는 걸까요?

나는 아치 리눅스와 우분투에서 이것을 관찰했지만 SSH 계정이 있는 솔라리스 서버에서는 관찰하지 않았습니다.

답변1

/dev/fd/3은 현재 프로세스를 가리키는 것 같습니다.

즉, ls그 자체입니다(PID는 나중에 존재하지 않습니다). 파일 설명자가 전역적이지 않기 때문에 이들 모두는 실제로 현재 프로세스에 속합니다. 전체 시스템에 대해 0, 1, 2가 하나만 있는 것이 아니라 각 프로세스에 대해 별도의 0, 1, 2가 있기 때문입니다.

Frederik Dweerdt가 지적한 것처럼 /dev/fd기호 링크입니다. ls다른 터미널에서 작업을 반복 하면 다른 pty에 대한 링크가 표시됩니다. 이는 명령의 출력과 일치합니다 tty.

ls예에서는 설명자 3이 파일 시스템을 읽는 데 사용된다고 가정합니다. 일부 C 명령(예: open())은 반환이 보장되는 파일 설명자 생성을 지원합니다."가장 낮은 번호의 사용되지 않은 파일 설명자"(POSIX-- 저수준 open()은 실제로 표준 C의 일부가 아닙니다. 따라서 닫은 후에는 재활용됩니다(다른 파일을 반복적으로 열고 닫으면 fd로 3이 계속해서 표시됩니다).

이것이 어떻게 존재하는지 이해하려면 opendir()ls의 소스 코드에서 찾을 수 있는 C 코드 조각을 참조하세요.

// open directory for reading
DIR *dh = opendir(".");
// print the fd of the directory handle to standard out:
printf("fd: %d\n", dirfd(dh));
closedir(dh);  

있는 그대로 실행하면 fd는 사용되지 않은 가장 낮은 설명자(0, 1, 2가 이미 존재함)이기 때문에 3이 됩니다.

답변2

/dev/fd/3표준 설명자가 아닙니다(편집: 할당). 귀하의 사례 ( )에 따라 (편집 : 0, 1 및 2 이상)입니다 ls. strace를 통해 ls를 실행하면 무슨 일이 일어나고 있는지 확인할 수 있습니다.

strace -e trace=openat,readlink ls -l /dev/fd/
openat(AT_FDCWD, "/dev/fd/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
readlink("/dev/fd/0", "/dev/pts/0", 65) = 10
readlink("/dev/fd/1", "/dev/pts/0", 65) = 10
readlink("/dev/fd/2", "/dev/pts/0", 65) = 10
readlink("/dev/fd/3", "/proc/28401/fd", 65) = 14

ls/dev/fd와 동일한 내용을 표시할 뿐입니다 /proc/self/fd. ls해당 항목을 읽으려면 디렉터리를 열어야 합니다. /dev/fd/3해당 디렉토리에 대한 파일 설명자입니다.

다른 프로그램에는 다음이 없습니다 /dev/fd/3.

start cmd:> sleep 100 &
[1] 28414

ec:0   17:28:10  hl@inno:~/.wine/drive_c
start cmd:> ls -l /proc/28414/fd
insgesamt 0
crw------- 1 hl tty 136, 0 18. Apr 01:18 0
crw------- 1 hl tty 136, 0 18. Apr 01:18 1
crw------- 1 hl tty 136, 0 18. Apr 01:18 2

답변3

Archlinux /dev/fd에서는 /proc/self/fd.fdls​이 명령은 디렉터리를 파일 설명자 3으로 엽니다.

편집: 그런데 무슨 일이 일어나고 있는지 이해하는 좋은 방법은 strace파일 설명자를 여는 프로세스를 볼 수 있습니다.

관련 정보