표준 스트림은 모두 동일한 파일(/dev/tty)에서 실행됩니까?

표준 스트림은 모두 동일한 파일(/dev/tty)에서 실행됩니까?

가상 터미널에 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데이터가 없습니다.

추가 자료:

관련 정보