bash/zsh가 fd0/1/2를 읽기-쓰기 모드로 여는 이유는 무엇입니까?

bash/zsh가 fd0/1/2를 읽기-쓰기 모드로 여는 이유는 무엇입니까?

내가 이해한 바로는 fd0은 표준 입력용이므로 프로세스는 표준 입력에서 읽기만 하고 쓰지 않습니다. 마찬가지로 fd1과 fd2는 stdout/stderr용이므로 프로세스는 여기에 쓰기만 합니다. 그러나 bash/zsh는 읽기-쓰기(u) 모드에서 tty 장치 파일을 한 번만 열고 3개의 설명자 간에 복사하는 것 같습니다. 이와 관련된 질문:

  1. 올바르게 이해하셨나요?
  2. 시스템 파일 테이블에 여러 항목을 저장하기 위해 복사합니까(각 항목은 다른 모드: r/w)? 행동에 차이가 있을까요?
  3. bash/zsh가 OS 독립적인 읽기-쓰기(u) 모드에서 fd0/1/2를 열 것이라고 가정하는 것이 안전합니까?

답변1

예, 이는 dup2().

주요 효과는 실제로 모두 동일한 "열린 파일" 구조를 참조하므로 직렬 콘솔의 전송 속도 설정이나 파일의 읽기/쓰기 위치와 같은 상태를 공유한다는 것입니다.

귀하의 프로그램은 stdin/stdout/stderr에 대해 "아마도 존재할 가능성이 높다"는 것 외에는 어떤 것도 가정할 수 없습니다. stdout이 파일이나 파이프로 리디렉션되면 쓰기 전용일 가능성이 높으며 다른 파일과 다른 파일을 참조합니다. 프로그램은 일반적으로 이러한 파일 설명자가 열려 있다고 가정할 수 있으며 사용자는 강제로 닫히면 이상한 일이 발생한다는 것을 알고 있습니다.

사용자와 대화하기 위해 터미널 핸들이 정말로 필요한 경우 /dev/tty프로그램에서 이를 열면 핸들이 제공됩니다.제어 터미널, 존재하는 경우. 프로그램이 백그라운드 서비스로 실행 중인 경우 실패할 수 있습니다.

관련 정보