이제 막 방법을 배우기 시작했어요모든 것이 파일이다TM on Linux를 사용하면 /dev/stdout을 그대로 읽으면 어떤 일이 일어날지 궁금합니다.
$ cat /dev/stdout
^C
$ tail /dev/stdout
^C
(이것은 ^C
프로그램이 중단된 후 프로그램을 종료하는 것입니다.)
사용하려고 하면 vim
"/dev/stdout"이(가) 파일이 아닙니다.라는 상상할 수 없는 메시지가 나타납니다. 헐떡거려!
그렇다면 이러한 "파일"을 읽으려고 할 때 끊김이나 오류 메시지가 나타나는 이유는 무엇입니까?
답변1
내가 왜 전화를 끊어?
cat(1)
및 에서 "정지"가 발생 하지 않으며 tail(1)
읽기만 차단됩니다. cat(1)
입력을 기다렸다가 전체 줄이 표시되면 즉시 인쇄합니다.
$ cat /dev/stdout
foo
foo
bar
bar
foo
Enterbar
EnterCTRL나는 - here 를 입력합니다 D.
tail(1)
입력을 기다리고 감지된 경우에만 인쇄합니다 EOF
.
$ tail /dev/stdout
foo
bar
foo
bar
foo
Enterbar
EnterCTRL여기에 -를 다시 입력합니다 D.
또는 오류 메시지
Vim은 오류를 발생시키는 유일한 도구입니다. 그것이 그러는 이유는 그것이기 때문이다달리다 stat(2)
이에 대해 해당 비트가 설정 /dev/stdout
되어 있지 않다는 것을 발견했습니다 S_IFREG
.
/dev/stdout
파일이지만정기적인문서. 실제로 커널에는 파일 시스템에 항목을 제공하는 춤이 있습니다. 리눅스의 경우:
$ ls -l /dev/stdout
lrwxrwxrwx 1 root root 15 May 8 19:42 /dev/stdout -> /proc/self/fd/1
OpenBSD에서:
$ ls -l /dev/stdout
crw-rw-rw- 1 root wheel 22, 1 May 7 09:05:03 2015 /dev/stdout
FreeBSD에서:
$ ls -l /dev/stdout
lrwxr-xr-x 1 root wheel 4 May 8 21:35 /dev/stdout -> fd/1
$ ls -l /dev/fd/1
crw-rw-rw- 1 root wheel 0x18 May 8 21:35 /dev/fd/1
답변2
(거의) 모든 것이 파일이지만 모든 것이 파일은 아닙니다.정기적인문서. 특수 파일(디렉토리, 네트워크 소켓, 직렬 포트 등)에 대해서는 텍스트 편집기를 호출할 필요가 없습니다.
이 파일은 /dev/stdout
UNIX 변형에 따라 다음 중 하나일 수 있습니다.
- "특수" 파일, 일반적으로 문자 장치;
- 이 설명자에 액세스하는 프로세스에 의해 열린 파일을 가리키는 "마법의" 기호 링크입니다.
- 위 중 하나에 대한 기호 링크입니다.
어떤 경우든 /dev/stdout
유사한 파일을 열면 응용 프로그램이 파일 설명자 1에서 이미 연 것과 동일한 파일과 연결된 새 파일 설명자가 생성됩니다. "Stdout"은 파일 설명자 1을 의미하며 이는 출력에 이 파일 설명자를 사용하는 규칙일 뿐입니다. 커널은 신경 쓰지 않습니다.
터미널에서 프로그램을 실행하면 세 가지 표준 설명자(0 = 표준 입력, 1 = 표준 출력, 2 = 표준 오류)가 모두 터미널 장치에서 열립니다. 이 장치에서 읽으면 사용자가 입력한 문자가 반환되고, 이 장치에 쓰면 터미널 창에 텍스트가 표시됩니다. (지정된 터미널 장치가 표시하는 출력을 읽거나 입력을 주입하는 표준 방법은 없습니다.)
이를 실행하면 cat /dev/stdout
세 개의 파일 설명자가 동일한 파일에 연결되어 있기 때문에 정확히 동일한 작업을 수행합니다. 터미널에서 읽으라고 지시합니다. 이것은 또한 틀림없는 사실이다.cat /dev/stdin
cat /dev/stderr
cat
cat
이 파일은 해당 명령을 cat /dev/stdout >foo
실행 하면 /dev/stdout
참조됩니다 . 구현 에 따라 오류가 발생하거나(GNU 버전에서는 "입력 파일이 출력 파일입니다"라고 불평함) 빈 파일 읽기 에서 시작하기 때문에 아무 작업도 수행하지 않을 수 있습니다. ( 그냥 잘립니다). 이 특별한 경우를 감지하지 못하는 버전 의 경우 비어 있지 않으면 해당 파일의 내용이 무기한으로 추가됩니다.foo
cat foo >foo
cat
foo
>foo
cat
foo
cat /dev/stdout >>foo
cat foo >>foo
을 실행하면 vim /dev/stdout
터미널을 편집하는 방법을 모르기 때문에 불평합니다(말이 안 됨).
답변3
cat
선택적 콘텐츠 와 tail
파일 끝을 찾고 있습니다. /dev/stdout
아직 열려 있으니 cat
계속 tail
찾아보세요.