에서
./binary < file
binary
stdin은 파일을 읽기 전용 모드로 엽니 다. 참고 bash
모든 파일을 읽을 수없는, 그냥 그것을 실행하는 프로세스의 파일 기술자 0 (표준 입력)에 읽기 위해 열립니다 binary
에서.
에서:
./binary << EOF
test
EOF
쉘에 따라 binary
의의 표준 입력은 삭제 된 임시 파일 포함 (AT & T KSH, zsh을, bash는 ...)이 될 것입니다 test\n
쉘 또는 파이프 (의 독서 말까지이 말했듯을 dash
, yash
그리고 쉘은 기록 test\n
병렬 파이프의 다른 쪽 끝에서). 귀하의 경우을 사용 bash
하는 경우 임시 파일이됩니다.
에서:
cat file | ./binary
쉘에 따라 binary
stdin은 파이프의 읽기 끝이거나 쓰기 방향이 종료 된 소켓 쌍의 한 쪽 끝 (ksh93)이며 다른 쪽 끝 cat
의 내용을 쓰고 file
있습니다.
stdin이 일반 파일 (임시 파일인지 아닌지) 인 경우 검색 할 수 있습니다. binary
시작 또는 끝으로 이동하거나 되감기 등을 할 수 있습니다. 또한 ioctl()s
FIEMAP / FIBMAP과 같은 작업을 수행 할 수 있습니다 ( <>
대신에 사용 하는 경우 <
구멍을 자르거나 구멍을 뚫을 수 있음).
반면에 파이프와 소켓 쌍은, 프로세스 간 통신 수단이다 많지 않다 binary
옆 할 수 있습니다 read
(일부 파이프 별과 같은 일부 작업 있기는하지만 데이터를 보내고 ioctl()
그들에 할 아니라 일반 파일에 수들) .
대부분의 경우 seek
파이프 작업을 할 때 응용 프로그램이 실패 / 불평하게하는 기능이 누락 되었지만 일반 파일에서는 유효하지만 다른 유형의 파일 (예 mmap()
: ftruncate()
, fallocate()
) 에서는 유효하지 않은 다른 시스템 호출 일 수 있습니다 . Linux에서는 /dev/stdin
fd 0이 파이프 나 일반 파일에있는 동안 열 때 동작에 큰 차이가 있습니다 .
검색 가능한 파일 만 처리 할 수있는 많은 명령이 있지만 일반적으로 stdin에서 열린 파일에는 해당되지 않습니다.
$ unzip -l file.zip
Archive: file.zip
Length Date Time Name
--------- ---------- ----- ----
11 2016-12-21 14:43 file
--------- -------
11 1 file
$ unzip -l <(cat file.zip)
# more or less the same as cat file.zip | unzip -l /dev/stdin
Archive: /proc/self/fd/11
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
unzip: cannot find zipfile directory in one of /proc/self/fd/11 or
/proc/self/fd/11.zip, and cannot find /proc/self/fd/11.ZIP, period.
unzip
파일 끝에 저장된 색인을 읽은 다음 파일 내에서 아카이브 멤버를 읽으십시오. 그러나 여기에서 파일 (첫 번째 경우 정규 파이프, 두 번째 파이프)은에 대한 경로 인수로 제공되며 부모에 의해 이미 열린 fd를 상속하는 대신 파일 자체 (일반적으로 0 이외의 fd unzip
에서)를 unzip
엽니 다. stdin에서 zip 파일을 읽지 않습니다. stdin은 주로 사용자 상호 작용에 사용됩니다.
binary
터미널 에뮬레이터에서 실행되는 대화 형 쉘의 프롬프트에서 리디렉션하지 않고 자신 의 것을 실행하면 binary
sstdin은 부모 쉘에서 상속되며, 그 자체는 부모에서 터미널 에뮬레이터에서 상속됩니다. pty 장치가 읽기 + 쓰기 모드로 열립니다 (같은 것 /dev/pts/n
).
이러한 장치는 찾을 수 없습니다. 따라서 binary
터미널에서 입력을받을 때 정상적으로 작동하면 문제는 추구하는 것이 아닙니다.
14가 errno (시스템 호출 실패로 설정된 오류 코드) 인 경우 대부분의 시스템에서 EFAULT
( Bad address )가됩니다. read()
쓰기 권한이 없습니다 메모리 주소로 읽어 요구한다면, 시스템 호출은 오류와 함께 실패합니다. 이는 fd가 포인트에서 파이프 또는 일반 파일로 데이터를 읽는지 여부와 무관하며 일반적으로 버그 1을 나타냅니다 .
binary
stdin에서 열린 파일의 유형을 (으로 fstat()
) 결정하고 일반 파일이나 tty 장치가 아닌 경우 버그가 발생합니다.
응용 프로그램에 대해 더 많이 알지 못하면 말하기가 어렵습니다. 아래를 실행 strace
(또는 truss
/ tusc
시스템에 상응하는) 우리가 어떤 여기에 실패하는 경우 시스템 호출이 무엇인지 확인하는 데 도움 수 있습니다.
1 Matthew Ife 가 귀하의 질문에 대한 의견을 제시 한 시나리오 는 여기서 그럴듯하게 들립니다. 그를 인용 :
나는 데이터를 읽기위한 버퍼 크기를 얻기 위해 파일 끝을 찾고, 탐색이 작동하지 않는 사실을 잘못 처리하고 음수 크기를 할당하려고 시도합니다 (잘못된 malloc을 처리하지 않음). 버퍼를 전달하여 버퍼에 지정된 오류가 유효하지 않은지 읽습니다.