Как программа определяет конец ввода stdin?

Как программа определяет конец ввода stdin?

Есть несколько способов предоставить программе ввод stdin.

  1. При использовании здесь-документа мы указываем разделитель для обозначения конца ввода stdin:

     << [-] слово
    здесь-документ
    разделитель
    

    Почему нам нужно явно указывать конец ввода stdin?

  2. При использовании здесь строки не требуется дополнительных усилий, чтобы сигнализировать об окончании ввода stdin:

     <<< слово
    

    Как программа узнает конец ввода stdin?

  3. При использовании перенаправления из файла на stdin нет дополнительных усилие сигнализировать об окончании ввода stdin.Откуда программа знает конец ввода stdin?

  4. При использовании конвейера для направления вывода stdout из другой программы на ввод stdin программы не требуется дополнительных усилий, чтобы сигнализировать об окончании ввода stdin? Как программа узнает конец ввода stdin?

  5. В некоторых программах, таких как bc , всякий раз, когда вы вводите арифметическое выражение и нажимаете return, оно принимает выражение как ввод stdin и выводит оценил результат. В таком случае, считается ли каждая строка, оканчивающаяся возвратом return, целым вводом стандартного ввода, или все строки, введенные с начала bc до выхода bc , считаются вводом стандартного ввода?

  6. Что такое общий принцип, согласно которому программа умеет обнаруживать конец ввода stdin?

    Когда нам нужно явно указать конец ввода stdin, например для здесь-документа, а когда он нам не нужен?

    Они программно-зависимые или программно-независимые?

0
01.03.2016, 02:34
1 ответ

Это зависит от конкретных системных вызовов, используемых процессом; read (2) в дескрипторе файла возвращает 0 в конце файла, в то время как потоковый ввод-вывод, вероятно, будет использовать вызов feof (3) . Возможно, придется покопаться в strace , чтобы увидеть, что именно делает функция более высокого уровня, такая как getline (3) или конкретное приложение под капотом, но большинство вещей, вероятно, будет сводиться к читать (2) или feof (3) .

Конечная метка heredoc является необязательной в сценарии оболочки (хотя и необходима, если последует другой код).

2
28.01.2020, 02:35

Теги

Похожие вопросы