標準ストリーム

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

コンピュータプログラミングでは標準ストリームは、実行を開始するときにコンピュータプログラムとその環境の間で相互接続された入力および出力通信チャネル[1]です。3つの入出力(I / O)接続は、標準入力stdin)、標準出力stdout)、および標準エラーstderr)と呼ばれます。元々、I / Oは物理的に接続されたシステムコンソール(キーボードからの入力、モニターからの出力)を介して発生しましたが、標準ストリームはこれを抽象化します。対話型シェルを介してコマンドを実行した場合、ストリームは通常、シェルが実行されているテキスト端末に接続されますが、リダイレクトまたはパイプラインで変更できます。より一般的には、子プロセスはその親プロセスの標準ストリームを継承します

アプリケーション

入力、出力、およびエラーの標準ストリーム

ユーザーは通常、標準ストリームを、入力デバイスからのデータを処理する、またはアプリケーションからのデータを書き込む入力および出力チャネルとして知っています。データは、任意のエンコーディングのテキスト、またはバイナリデータの場合があります。最近の多くのシステムでは、プログラムの標準エラーストリームは、通常はエラー分析の目的でログファイルにリダイレクトされます。

ストリームは、アプリケーションをチェーンするために使用できます。つまり、あるプログラムの出力ストリームをリダイレクトして、別のアプリケーションへの入力ストリームにすることができます。多くのオペレーティングシステムでは、これはアプリケーション名を縦棒文字で区切って一覧表示することで表されます。このため、パイプライン文字と呼ばれることがよくあります。よく知られている例は、moreなどのページネーションアプリケーションを使用して、ディスプレイ上の出力ストリームの表示をユーザーが制御できるようにすることです。

背景

Unixより前のほとんどのオペレーティングシステムでは、プログラムは適切な入力デバイスと出力デバイスに明示的に接続する必要がありました。OS固有の複雑さにより、これは面倒なプログラミング作業になりました。多くのシステムでは、環境設定の制御を取得し、ローカルファイルテーブルにアクセスし、目的のデータセットを決定し、パンチカードリーダー磁気テープドライブディスクドライブラインプリンター、カードパンチの場合はハードウェアを正しく処理する必要がありました。、またはインタラクティブ端末。

Unixのいくつかの画期的な進歩の1つは抽象デバイスでした。これにより、プログラムが通信しているデバイスの種類を認識または処理する必要がなくなりました[要出典]古いオペレーティングシステムは、プログラマーにレコード構造と、多くの場合、非直交データセマンティクスとデバイス制御を強制しました。Unixは、データストリームの概念、つまりファイルの終わりまで読み取ることができるデータバイトの順序付けられたシーケンスによって、この複雑さを解消しましたプログラムは、必要に応じてバイトを書き込むこともできますが、その必要はなく、カウントやグループ化を簡単に宣言することはできません。

もう1つのUnixのブレークスルーは、デフォルトで入力と出力をそれぞれターミナルキーボードとターミナルディスプレイに自動的に関連付けることでした[要出典] —プログラム(およびプログラマー)は、一般的な入出力プログラムの入出力を確立するためにまったく何もしませんでした(別のパラダイムを選択しない限り)。対照的に、以前のオペレーティングシステムでは、通常、接続を確立するためにいくつかの(多くの場合複雑な)ジョブ制御言語が必要でした。または、同等の負担をプログラムで調整する必要がありました。[要出典]

Unixは標準ストリームを提供していたため、UnixCランタイム環境もそれをサポートする必要がありました。その結果、ほとんどのCランタイム環境(およびCの子孫)は、オペレーティングシステムに関係なく、同等の機能を提供します。

標準入力(stdin)

標準入力は、プログラムが入力データを読み取るストリームです。プログラムは、読み取り操作を使用してデータ転送を要求します。すべてのプログラムがストリーム入力を必要とするわけではありません。たとえば、dirおよびlsプログラム(ディレクトリに含まれるファイル名を表示する)はコマンドライン引数を取ることができますが、ストリームデータを入力せずにそれらの操作を実行します。

リダイレクトされない限り、標準入力は親プロセスから継承されます。インタラクティブシェルの場合、通常はキーボードに関連付けられています

標準入力のファイル記述子は0(ゼロ)です。POSIX <unistd.h>定義はSTDIN_FILENO;です。対応するC <stdio.h>変数はFILE* stdin;です。同様に、C++ <iostream>変数はstd::cinです。

標準出力(stdout)

標準出力は、プログラムが出力データを書き込むストリームです。プログラムは、書き込み操作でデータ転送を要求します。すべてのプログラムが出力を生成するわけではありません。たとえば、ファイルの名前変更コマンド(さまざまにmvmove、またはrenと呼ばれます)は、成功するとサイレントになります。

リダイレクトされない限り、標準出力は親プロセスから継承されます。インタラクティブシェルの場合、それは通常、プログラムを開始し たテキスト端末です。

標準出力のファイル記述子は1(1)です。POSIX <unistd.h>定義はSTDOUT_FILENO;です。対応するC <stdio.h>変数はFILE* stdout;です。同様に、C++ <iostream>変数はstd::coutです。

標準エラー(stderr)

標準エラーは、エラーメッセージまたは診断を出力するためにプログラムによって通常使用される別の出力ストリームです。これは標準出力に依存しないストリームであり、個別にリダイレクトできます。

これにより、半述語の問題が解決され、出力とエラーを区別できるようになります。これは、値のペアを返す関数に似ています。「半述語の問題:複数値の戻り値」を参照してください。通常の宛先は、標準出力がリダイレクトされた場合でも表示される可能性が最も高くなるようにプログラムを開始したテキスト端末です(したがって、すぐには観察されません)。たとえば、パイプライン内のプログラムの出力は、次のプログラムまたはテキストファイルの入力にリダイレクトされますが、各プログラムからのエラーはテキスト端末に直接送信されるため、ユーザーはリアルタイムで確認できます。[2]

標準出力標準エラーをテキスト端末などの同じ宛先に送信することは許容され、正常です。バッファリングが含まれない限り、メッセージはプログラムがメッセージを書き込むのと同じ順序で表示されますたとえば、一般的な状況では、標準エラーストリームはバッファリングされていませんが、標準出力ストリームはラインバッファリングされています。この場合、標準出力ストリームバッファがまだいっぱいになっていないと、後で標準エラーに書き込まれたテキストが先に端末に表示されることがあります。

標準エラーファイル記述子は、 POSIXによって2(2)として定義されています。<unistd.h>ヘッダーファイルはシンボルを提供しますSTDERR_FILENO; [3]対応するC <stdio.h>変数はFILE* stderrC ++ <iostream>std::cerr標準ヘッダーは、このストリームに関連付けられた2つの変数を提供します。std::clog前者はバッファリングされておらず、後者は他のすべてのC++ストリームと同じバッファリングメカニズムを使用しています。

ボーンスタイルのシェルを使用すると、標準エラーを、標準出力が使用するように指示されているのと同じ宛先にリダイレクト できます。

2>&1

cshスタイルのシェルを使用すると、標準エラーを、標準出力が使用するように指示されているのと同じ宛先にリダイレクト できます。

>&

1970年代に、ユーザーの端末に表示される代わりにエラーメッセージがタイプセットされて、いくつかの無駄な写真植字の実行が終了した後、標準エラーがUnixに追加されました。[4]

タイムライン

1950年代:Fortran

Fortranには、Unixファイル記述子と同等のものがあります。慣例により、多くのFortran実装ではUNIT=5、stdin、UNIT=6stdout、およびUNIT=0stderrにユニット番号が使用されます。Fortran-2003では、組み込みISO_FORTRAN_ENVモジュールは、名前付き定数、、を含み、ユニット番号を移植可能に指定するように標準化されINPUT_UNITましOUTPUT_UNITERROR_UNIT

FORTRAN77の例
      プログラムMAININTEGERNUMBER 
        READ UNIT = 5 * NUMBER 
        WRITE UNIT = 6 、 ' A、I3)' ) ' NUMBER IS:' NUMBER END 
         
      
Fortran2003サンプル
プログラム主な
  用途iso_fortran_env
  暗黙的なし
整数::数値読み取りユニット= INPUT_UNIT * 数値書き込みユニット= OUTPUT_UNIT '(a、i3)' '数値は:' 数値終了プログラム    
    
     

1960年:ALGOL60

ALGOL 60は、標準のファイルアクセスがないことで批判されました。[要出典]

1968年:ALGOL68

ALGOL 68の入力および出力機能は、まとめてトランスプットと呼ばれていました。[5] Kosterは、トランスプット標準 の定義を調整しました。モデルには、、、およびの3つの標準チャネルが含まれていstand inました。 stand outstand back

#ALGOL 68の例#
主要:(
  実数;
  getf(stand in、($ g $、number));
  printf(($ "Number is:" g(6,4) "OR" $、number)); # また #
  putf(stand out、($ "Number is:" g(6,4) "!" $、number));
  改行(目立つ)
)。
入力: 出力:
3.14159
番号は:+3.142または番号は:+3.142!

1970年代:CおよびUnix

Cプログラミング言語では、標準の入力、出力、およびエラーストリームが、それぞれ既存のUnixファイル記述子0、1、および2に付加されます。[6] POSIX環境では、マジックナンバーではなく、< unistd.h >定義STDIN_FILENO STDOUT_FILENO またはSTDERR_FILENO使用する必要があります。ファイルポインタstdinstdout、およびstderrも提供されます。

Ken Thompson(元のUnixオペレーティングシステムの設計者および実装者)は、バージョン5 Unixでソートを変更して、標準入力を表す「-」を受け入れました。これは、他のユーティリティに広がりバージョン8で特別なファイルとしてオペレーティングシステムの一部になりました。診断はバージョン6までの標準出力の一部であり、その後、デニスM.リッチーが標準エラーの概念を作成しました。[7]

1995年:Java

Javaでは、標準ストリームはSystem.in(stdinの場合)、System.out(stdoutの場合)、および System.err(stderrの場合)によって参照されます。[8]

public  static  void  main String  args []  { 
    try  { 
        BufferedReader  br  =  
          new  BufferedReader new  InputStreamReader System .in )); 文字列s = br readLine (); 倍数=倍倍_ parseDouble s ); システムアウトprintln "数値は:" +数値
           
           
          ); 
    }  catch  Exception  e  { 
        System エラーprintln "エラー:"  +e。getMessage  ; } }
    

2000年代:.NET

C#およびその他の.NET言語では、標準ストリームはSystem.Console.In(stdinの場合)、System.Console.Out(stdoutの場合)、およびSystem.Console.Error(stderrの場合)によって参照されます。[9] stdinおよびstdoutストリームの基本的な読み取りおよび書き込み機能も、クラスを介して直接アクセスできますSystem.Console(たとえば、のSystem.Console.WriteLine()代わりに使用できますSystem.Console.Out.WriteLine())。

System.Console.InSystem.Console.OutおよびSystem.Console.ErrorSystem.IO.TextReader(stdin)およびSystem.IO.TextWriter(stdout、stderr)オブジェクトであり、基礎となる標準ストリームへのアクセスのみをテキストベースで許可します。標準ストリームへの完全なバイナリアクセスは、、、およびSystem.IO.Streamによってそれぞれ返されるオブジェクトを介して実行する必要があります。 System.Console.OpenStandardInput()System.Console.OpenStandardOutput()System.Console.OpenStandardError()

// C#の例
public  static  int  Main string []  args 
{ 
    try  { 
        string  s  =  System コンソールReadLine (); 
        倍数 =倍倍_  解析s ); システムコンソールアウトWriteLine "数値は:{0:F3}" 数値); 0を返す; 
         
         

    // Parse()が例外をスローした場合
    }  catch  ArgumentNullException  {  
        System コンソールエラーWriteLine "番号が入力されていません!" ); 
    }  catch  FormatException  { 
        System コンソールエラーWriteLine "指定された値は有効な数値ではありません!" ); 
    }  catch  OverflowException  { 
        System コンソールエラーWriteLine "指定された数が大きすぎます!" ); 
    }

    戻り -1 ; }

'VisualBasic.NETの例

Public  Function  Main () As  Integer 
    Try 
        Dim  s  As  String  =  System コンソール[] ReadLine ()
        Dim  number  As  Double  =  Double 解析s 
        システムコンソールアウトWriteLine "数値は:{0:F3}"  数値
        戻り 値0

    'Parse()が例外
    Catch  exAsSystemを スローした場合 ArgumentNullExceptionシステムコンソール[エラー] WriteLine 「番号が入力されていません!」ex2AsSystemキャッチしますFormatExceptionシステムコンソール[エラー] WriteLine "指定された値は有効な数値ではありません!" ex3AsSystemキャッチしますOverflowExceptionシステム
        
       
        
       
        コンソール[エラー] WriteLine "指定された数が大きすぎます!" 
    End  Try

    Return  - 1
終了 関数

System.Diagnostics.Process クラスを適用する場合、そのクラスのインスタンスプロパティ、、、 StandardInputおよびStandardOutputを使用StandardErrorして、プロセスの標準ストリームにアクセスできます。

2000-:Python(2または3)

次の例は、標準入力を標準出力とテキストファイルの両方にリダイレクトする方法を示しています。

#!/ usr / bin / env python
 sysをインポート
#現在のstdoutを保存して、sys.stdoutを元に戻せるようにします
#リダイレクトが完了した後
stdin_fileno  =  sys stdin
stdout_fileno  =  sys stdout
#sys.stdoutをファイルにリダイレクトします
sys stdout  =  open 'myfile.txt'  'w' 
ctr  =  0
 stdin_fileno inpsの場合 
    ctrs  =  str ctr 
    #リダイレクトされたstdoutに出力します()
    sys stdout write ctrs  +  ")これはリダイレクトされたものになります--->"  +  inps  +  ' \ n ' 
    #実際に保存されたstdoutハンドラーに出力します
    stdout_fileno write ctrs  +  ")これは実際の--->"  +  inps  +  ' \ n ' 
    ctr  =  ctr  +  1
#ファイルを閉じる
sys stdout 閉じる()
#sys.stdoutを古い保存済みファイルハンドラーに復元します
sys stdout  =  stdout_fileno

GUI

グラフィカルユーザーインターフェイス(GUI)は、常に標準ストリームを利用するとは限りません。GUIが基盤となるスクリプトやコンソールプログラムのラッパーである場合に実行されます。たとえば、DebianやUbuntuでaptコマンドをラップするSynapticパッケージマネージャーGUIなどです。ZenityやKDialogbyKDEプロジェクト[10]などのスクリプトツールで作成されたGUIは、stdin、stdout、stderrを利用し、 QtGTK、またはその他を使用してC / C ++でプログラムおよびコンパイルされた完全なGUIではなく、単純なスクリプトに基づいています。同等の独自のウィジェットフレームワーク。

NeXTSTEPおよびMacOSXに実装されているサービスメニューも、標準ストリームに類似しています。これらのオペレーティングシステムでは、グラフィカルアプリケーションは、どのアプリケーションに関係なく、GUI の現在の選択に基づいて動作するシステム全体のメニューを通じて機能を提供できます。

一部のGUIプログラムは、主にUnix上で、デバッグ情報を標準エラーに書き込みます。その他(多くのUnixメディアプレーヤーなど)は、標準入力からファイルを読み取る場合があります。GUIウィンドウに加えて別のコンソールウィンドウを開く人気のあるWindowsプログラムは、エミュレーターpSXDOSBoxです。

GTKサーバーは、GUIを実現するために、解釈されたプログラムとの通信インターフェースとしてstdinを使用できます。

Common Lisp Interface Managerパラダイムは、拡張出力ストリームに送信されるGUI要素を「提示」します。

も参照してください

参照

  1. ^ DM Ritchie、「A Stream Input-Output System」、AT&T Bell Laboratories Technical Journal、68(8)、1984年10月。
  2. ^ 「Linuxのstdin、stdout、stderrとは何ですか?|CodePre.com」2021年12月2日2022年4月8日取得
  3. ^ "<unistd.h>"Open Group Base Specification Issue 6—IEEE Std 1003.1、2004Editionオープングループ。2004年。
  4. ^ ジョンソン、スティーブ(2013-12-11)。「[TUHS]グラフィックシステムC/A / Tフォトタイプセッター」(メーリングリスト)。2020-09-25にオリジナルからアーカイブされました2020年11月7日取得
  5. ^ アルゴリズム言語Algol68に関する改訂レポート、A。van Wijngaarden、BJ Mailloux、JEL Peck、CHA Koster、M。Sintzoff、CH Lindsey、LGLT Meertens、RG Fiskerが編集、 http://www.softwarepreservation.org/projects /ALGOL/report/Algol68_revised_report-AB.pdf、セクション10.3
  6. ^ "Stdin(3):標準のI/Oストリーム-Linuxのマニュアルページ"
  7. ^ McIlroy、MD(1987)。Research Unixリーダー:プログラマーマニュアル、1971年から1986年(PDF)(テクニカルレポート)からの注釈付きの抜粋。CSTR。ベル研究所。139。
  8. ^ 「システム(Java Platform SE 7)」2012年7月20日取得
  9. ^ 「C#リファレンスソース、.NET Framework 4.7.1、mscorlib、コンソールクラス」referencesource.microsoft.com 2017年12月10日取得
  10. ^ Kißling、Kristian(2009)。「ZenityとKDialogを使用してスクリプトにグラフィック要素を追加する」LinuxMagazine2021-04-11を取得

ソース

外部リンク