텍스트 편집기를 사용하여 /dev/stdout을 읽을 수 없는 이유는 무엇입니까?

텍스트 편집기를 사용하여 /dev/stdout을 읽을 수 없는 이유는 무엇입니까?

이제 막 방법을 배우기 시작했어요모든 것이 파일이다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

fooEnterbarEnterCTRL나는 - here 를 입력합니다 D.

tail(1)입력을 기다리고 감지된 경우에만 인쇄합니다 EOF.

$ tail /dev/stdout
foo
bar
foo
bar

fooEnterbarEnterCTRL여기에 -를 다시 입력합니다 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/stdoutUNIX 변형에 따라 다음 중 하나일 수 있습니다.

  • "특수" 파일, 일반적으로 문자 장치;
  • 이 설명자에 액세스하는 프로세스에 의해 열린 파일을 가리키는 "마법의" 기호 링크입니다.
  • 위 중 하나에 대한 기호 링크입니다.

어떤 경우든 /dev/stdout유사한 파일을 열면 응용 프로그램이 파일 설명자 1에서 이미 연 것과 동일한 파일과 연결된 새 파일 설명자가 생성됩니다. "Stdout"은 파일 설명자 1을 의미하며 이는 출력에 이 파일 설명자를 사용하는 규칙일 뿐입니다. 커널은 신경 쓰지 않습니다.

터미널에서 프로그램을 실행하면 세 가지 표준 설명자(0 = 표준 입력, 1 = 표준 출력, 2 = 표준 오류)가 모두 터미널 장치에서 열립니다. 이 장치에서 읽으면 사용자가 입력한 문자가 반환되고, 이 장치에 쓰면 터미널 창에 텍스트가 표시됩니다. (지정된 터미널 장치가 표시하는 출력을 읽거나 입력을 주입하는 표준 방법은 없습니다.)

이를 실행하면 cat /dev/stdout세 개의 파일 설명자가 동일한 파일에 연결되어 있기 때문에 정확히 동일한 작업을 수행합니다. 터미널에서 읽으라고 지시합니다. 이것은 또한 틀림없는 사실이다.cat /dev/stdincat /dev/stderrcatcat

이 파일은 해당 명령을 cat /dev/stdout >foo실행 하면 /dev/stdout참조됩니다 . 구현 에 따라 오류가 발생하거나(GNU 버전에서는 "입력 파일이 출력 파일입니다"라고 불평함) 빈 파일 읽기 에서 시작하기 때문에 아무 작업도 수행하지 않을 수 있습니다. ( 그냥 잘립니다). 이 특별한 경우를 감지하지 못하는 버전 의 경우 비어 있지 않으면 해당 파일의 내용이 무기한으로 추가됩니다.foocat foo >foocatfoo>foocatfoocat /dev/stdout >>foocat foo >>foo

을 실행하면 vim /dev/stdout터미널을 편집하는 방법을 모르기 때문에 불평합니다(말이 안 됨).

답변3

cat선택적 콘텐츠 와 tail파일 끝을 찾고 있습니다. /dev/stdout아직 열려 있으니 cat계속 tail찾아보세요.

답변4

이것을 시도하십시오

sudo su
chmod +x /dev/stdout
chmod +x /dev/stderr
exit su

나는 그것을 시도했고 효과가 있었습니다. 당신은 그것을 시도함으로써 배울 것입니다 :)

왜 필요한지 모르겠어요? 누구든지 설명할 수 있나요?

표준 출력 권한 정보 표준 입력 권한 정보 내 목표는 해피엔딩

관련 정보