$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty 136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim 64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
- 그 아래의 모든 파일과 하위 디렉터리가
/dev
장치에 대한 파일 설명자인지 궁금합니다. - 왜 이렇게 서로 연결되는 링크가 많은 걸까요? 예를 들어,
/dev/fd/0
,/dev/stdin
은/proc/self/fd/0
모두 포인팅 링크입니다/dev/pts/2
. - 평균 링크
l
에 있다면 무엇 을 의미합니까 ?lrwx------
c
crw--w----
답변1
거의 모든 파일 /dev
은장치 파일. 일반 파일을 읽고 쓰는 것은 디스크나 다른 파일 시스템에 데이터를 저장하는 반면, 장치 파일에 액세스하는 것은 커널의 드라이버와 통신하며, 이는 일반적으로 하드웨어(하드웨어 장치, 따라서 이름)와 통신합니다.
b
장치 파일에는 블록 장치( 출력의 첫 번째 문자로 표시 ls -l
)와 문자 장치( 로 표시 c
) 의 두 가지 유형이 있습니다 . 블록 장치와 문자 장치의 구별은 완전히 보편적이지 않습니다. 블록 장치는 디스크와 같으며 큰 고정 크기 파일처럼 동작합니다. 특정 오프셋에서 바이트를 쓴 다음 해당 오프셋에서 장치에서 읽으면 이 바이트를 얻습니다. 문자 장치는 바이트 쓰기가 직접적인 영향을 미치고(예: 직렬 회선에서 방출됨) 바이트를 읽는 것도 직접적인 영향을 미치는(예: 직렬 포트에서 읽음) 다른 장치와 매우 유사합니다.
장치 파일의 의미는 이름이 아니라 번호로 결정됩니다(이름은 응용 프로그램에 중요하지만 커널에는 중요하지 않습니다). 숫자는 실제로 두 개의 숫자입니다. 어떤 드라이버가 장치를 담당하는지 나타내는 메이저 번호와 드라이버가 여러 장치를 구동할 수 있도록 하는 마이너 번호입니다. 이 숫자는 ls -l
일반적으로 파일 크기를 확인할 수 있는 목록에 나타납니다. 예를 들어 brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ 이 장치의 기본 장치는 8이고 보조 장치는 0입니다.
아래 장치 파일 중 일부는 /dev
하드웨어 장치에 해당하지 않습니다. 모든 UNIX 시스템에는 하나가 있습니다 /dev/null
. 여기에 써도 아무 효과가 없으며 읽어도 데이터가 반환되지 않습니다. 쉘 스크립트에서 이는 명령의 출력을 무시 >/dev/null
하거나( ) 입력 없이 명령을 실행하려는 경우( )에 편리한 경우가 많습니다. </dev/null
다른 일반적인 예는 다음과 같습니다 /dev/zero
(널 바이트 반환무기한)/dev/urandom
(임의의 바이트를 반환합니다.무기한).
일부 장치 파일의 의미는 해당 파일에 액세스하는 프로세스에 따라 다릅니다. 예를 들어, /dev/stdin
현재 프로세스의 표준 입력을 지정하면 프로세스의 표준 입력으로 열린 원본 파일을 여는 것과 거의 같은 효과가 있습니다. 다소 유사하게 /dev/tty
프로세스가 연결된 터미널을 지정합니다. 오늘날 Linux에서 /dev/stdin
친구는 더 이상 문자 장치로 구현되지 않지만 각 파일 설명자를 참조할 수 있는 보다 일반적인 메커니즘에 대한 기호 링크로 구현됩니다(예: 기존 접근 방식에서는 0, 1, 2만 사용) /dev/stdin
. 에 대한 심볼릭 링크 /proc/self/fd/0
. 바라보다/dev/fd와 /proc/self/fd/ 사이의 관계는 무엇입니까?.
아래에서 많은 심볼릭 링크를 찾을 수 있습니다 /dev
. 이는 역사적인 이유로 발생할 수 있습니다. 장치 파일이 한 이름에서 다른 이름으로 이동되었지만 일부 응용 프로그램은 여전히 이전 이름을 사용합니다. 예를 들어, Linux에서는 /dev/scd0
기호 링크이며 /dev/sr0
둘 다 첫 번째 CD 장치를 지정합니다. 심볼릭 링크의 또 다른 이유는 구성입니다. Linux에서는 여러 위치에서 하드 디스크와 파티션을 찾을 수 있습니다. /dev/sda
그리고 /dev/sda1
친구(각 디스크는 임의의 문자로 지정되고 파티션 레이아웃에 따라 분할됩니다), /dev/disk/by-id/*
(고유 일련 번호로), /dev/disk/by-label/*
(수동으로 선택한 레이블로 지정된 파일 시스템이 있는 파티션) 기호 링크 는 /dev/dvd
기호 링크일 수 있습니다. 또는 두 개의 CD 판독기가 있고 두 번째 판독기가 기본 DVD 판독기인 경우공통 장치 이름이 여러 장치 이름 중 하나인 경우에도 사용됩니다. 예를 들어/dev/sr0
/dev/sr1
/dev
마지막으로, 레거시 이유로 인해 아래에서 몇 가지 추가 파일을 찾을 수 있습니다. 모든 시스템에서 동일한 콘텐츠를 찾을 수는 없습니다. 대부분의 unice에서는 /dev/log
그렇습니다 .소켓로그 메시지를 발행하는 데 사용되는 프로그램입니다. /dev/MAKEDEV
에 항목을 생성하는 스크립트입니다 /dev
. 최신 Linux 시스템에서는 항목이 /dev/
다음 명령에 의해 자동으로 생성됩니다.우데브, 구식입니다 MAKEDEV
.
¹ Linux에서는 실제로 더 이상 적용되지 않지만 이 세부 사항은 장치 드라이버 작성자에게만 중요합니다.
답변2
- 그렇습니다. 직접적으로든 심볼릭 링크로든 그게 목적입니다
/dev/
. - 다양한 목적을 위해: 때로는 명명 체계 간의 호환성을 위해, 때로는 작업 환경에 필요합니다
/dev/stdin
.아니요보다정적으로아니면/dev/pts/2
다른 터미널로 전환하면 알 수 있습니다./dev/stdin
표준 입력입니다현재의터미널 세션. 이는 심볼릭 링크가 필요한 이유에 대한 예이기도 합니다. man mknod
및 을 참조하십시오info coreutils 'mknod invocation'
. 일반적으로c
문자 장치 유형을 나타냅니다.
답변3
첫 번째 질문은 파일 설명자가 아니라 장치 파일입니다. (일명 "개발 노드")
이러한 파일은 메이저 및 마이너 장치 번호를 사용하여 장치를 처리하는 드라이버에 바인딩됩니다. (예를 들어 ls
출력의 "136, 2"는 주요 장치 번호 136에 바인딩된 장치 드라이버를 나타내며 해당 드라이버가 처리할 장치 #2를 지정합니다.)
장치 파일인 경우 출력의 첫 번째 문자 ls -l
는 장치 유형입니다. "c"이면 문자 장치이고, "b"이면 블록 장치입니다.
두 번째 질문은 위의 rozcietrzewiacz의 답변을 참조하세요.