プログラムは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閉じるタグは完全にオプションです(後に他のコードがある場合は必須ですが)。

関連情報