프로그램은 stdin 입력의 끝을 어떻게 감지합니까?

프로그램은 stdin 입력의 끝을 어떻게 감지합니까?

프로그램은 stdin 입력의 끝을 어떻게 감지합니까?

표준 입력으로 프로그램에 입력을 제공하는 방법에는 여러 가지가 있습니다.

  1. here-document를 사용할 때 stdin 입력의 끝을 나타내는 구분 기호를 지정합니다.

    <<[−]word
    here-document
    delimiter
    

    왜 stdin 입력의 끝을 명시적으로 지정해야 합니까?

  2. 다음과 같은 문자열을 사용할 때 표준 입력의 끝을 나타내기 위해 추가 노력이 필요하지 않습니다.

    <<< word
    

    프로그램은 stdin 입력의 끝을 어떻게 알 수 있습니까?

  3. 파일에서 stdin으로의 리디렉션을 사용할 때 stdin 입력의 끝을 알리기 위해 추가적인 노력이 필요하지 않습니다. 프로그램은 stdin 입력의 끝을 어떻게 알 수 있습니까?

  4. 파이프를 사용하여 다른 프로그램의 stdout 출력을 해당 프로그램의 stdin 입력으로 보낼 때 stdin 입력의 끝을 알리는 데 추가 노력이 필요하지 않습니까? 프로그램은 stdin 입력의 끝을 어떻게 알 수 있습니까?

  5. 예를 들어 일부 프로그램에서는 bc산술 표현식을 입력하고 Enter 키를 누를 때마다 해당 표현식을 stdin으로 가져와 계산 결과를 출력합니다. 이 경우 return으로 끝나는 각 줄은 전체 표준 입력으로 간주됩니까, 아니면 bc처음부터 끝까지 입력된 모든 줄이 bc표준 입력으로 간주됩니까?

  6. 프로그램이 stdin 입력의 끝을 감지하는 방법을 아는 일반적인 원리는 무엇입니까?

    here-document와 같이 stdin 입력의 끝을 명시적으로 지정해야 하는 경우와 그렇지 않은 경우는 언제입니까?

    프로그램 종속적입니까 아니면 프로그램 독립적입니까?

답변1

이는 프로세스에서 사용하는 특정 시스템 호출에 따라 다릅니다. read(2)파일 설명자의 메서드는 0파일 끝에서 반환되지만 스트림 I/O는 해당 feof(3)호출을 사용할 수 있습니다. 일부 고급 기능이나 특정 애플리케이션이 배후에서 수행하는 작업을 strace정확히 이해하려면 조금 더 깊이 파고들 필요가 있지만 getline(3)대부분의 사항은 아마도 read(2)또는 feof(3).

쉘 스크립트에서 heredoc 닫는 태그는 완전히 선택 사항입니다(뒤에 다른 코드가 있는 경우 필수임에도 불구하고).

관련 정보