가상 터미널에 ls -l /dev를 입력하면 다음과 같은 결과가 나타납니다.
lrwxrwxrwx 1 root root 15 apr 10 10:59 stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 apr 10 10:59 stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 apr 10 10:59 stdout -> /proc/self/fd/1
그런 다음 ls -l /proc/self/fd를 입력하면 다음을 얻습니다.
lrwx------ 1 user user 64 apr 10 19:59 0 -> /dev/pts/1
lrwx------ 1 user user 64 apr 10 19:59 1 -> /dev/pts/1
lrwx------ 1 user user 64 apr 10 19:59 2 -> /dev/pts/1
모든 항목은 동일한 장치 파일을 가리키며 이는 가상 쉘의 제어 터미널이기도 합니다("tty" 명령으로 확인됨). 따라서 stdin, sdout 및 stderr 파일 설명자가 모두 동일한 파일(/dev/pts/1)에서 실행된다고 가정하는 것이 정확합니까? 예를 들어 세 개의 별도 open() 호출이 수행되었습니다(가상 쉘 프로세스가 분기) 상위 프로세스)를 동일한 파일에 포함합니까?
그렇다면 다음 프로그램을 실행해 보세요.
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int rfd = open("./a_file",O_RDONLY);
int wfd = open("./a_file",O_WRONLY);
char rc='a',wc='b';
if (write(rfd,&wc,1)<0) {
perror("Error");
}
if (read(wfd,&rc,1)<0) {
perror("Error");
}
}
다음을 제공합니다:
Error: Bad file descriptor
Error: Bad file descriptor
예상한 대로, read() 매개변수에서 rfd를 1(sdtout)로, wfd를 0(stdin)으로 변경하면 오류가 발생하지 않습니다. 이것은 /dev/tty가 O_RDWR 플래그로 열렸다는 것을 의미합니까?
시도할 때:
if (write(1,&wc,1)<0) {
perror("Error");
}
if (read(0,&rc,1)<0) {
perror("Error");
}
콘솔에 "b"가 표시되지만 파일에서 데이터를 읽지 않은 것처럼 read() 호출이 반환되지 않습니다. 왜 그런 겁니까?
답변1
모두 동일한 장치를 참조한다는 데 동의합니다. 실제 질문은 끝에 나옵니다. 단지 연결 이외의 read
이유로는 아무것도 반환될 수 없습니다./dev/tty
입력하다그것에산출, 그러나 (셸) 프로세스와 실제 장치(예: Linux 콘솔) 간의 연결입니다. 위의 예와 같이 호스트에서 데이터를 읽고 응답(호출에 data 을 제공)하는 프로그램을 콘솔에서 실행할 수 있지만 read
추가 연결이 없으면 read
데이터가 없습니다.
추가 자료:
- /dev/tty*에 기록된 내용을 읽습니다.
- /dev/pts 파일에는 무엇이 저장되어 있으며 열 수 있나요?
- tty* 장치를 어떻게 읽고 쓰나요?, 중복은 아니지만
설명 없이 데이터 부족에 대해 동일한 관찰을 합니다.