2011-07-01 11 views
3
#include <unistd.h> 
int main(int argc, char* argv[]) 
{ 
    char buf[500]; 
    read(0, buf, 5); 
    return 0; 
} 

stdinから上記read 5つの文字、私は5より入力場合:このような動作は標準で定義されていますか?

12345morethan5 
[[email protected] test]# morethan5 
-bash: morethan5: command not found 

残りの文字は、シェルコマンドとして実行されます。

このような動作は標準で定義されていますか?あなたのプログラムは、5つの文字を読み込み、それはそれだ:-)

+0

このセクションの3.3.2は、http: /www.aosabook.org/ja/bash.html – Joe

答えて

5

ソート。それほど重要ではない。残りの部分はターミナルバッファに残り、Cプログラムが終了するとシェルに送られます。

生のシステムコールであるread()を使用しているため、C stdioバッファリングの代わりにこの動作は期待されていませんが、にはが必要です。 POSIX標準から

read()

オン:リード()関数は により指されるバッファに、開いているファイル 記述子、fildesに対応するファイル からnbyteバイトを読み取る しようとするもの

buf。

... nbyteが0より大きい正常終了、時

、(読み取り)が更新の マークはファイルのst_atimeをフィールドものとし、読み取ったバイト数 を返します。 この数値は、決して でなければなりません。

...正常終了

、(読み取り) [XSI] [オプションスタート]とPREAD() [オプションエンド]バイトの 数を示す 非負の整数を返します実際にを読んでください。

e.e.e. read()になりません。要求されたバイト数よりも多くのバイトをファイル記述子から読み込みます。端末上のrelated partから

一度に に行全体を読み取るために、しかし、必要はありません。 1つでも バイトの任意の数が、情報を失うことなく read()で要求されることがあります。

...

の端末デバイスファイルをクローズする最後プロセスは、任意の出力デバイスと、廃棄される任意の入力に送られるせなければなりません。

注:通常、セッションを終了するまで、シェルには端末のファイル記述子がまだ開いています。

+0

これは**必須**と言っていいでしょうか? –

+1

@Je Rog:必要な場合は、Posix仕様の端末の仕組みになると思います。すなわち、端末からの入力を受けているが、そのプログラムによって読み込まれていないプログラムがある間に発生するキー押下はどうなるか。 I/Oの仕様は、入力がバッファされていないことを最大限に定義するので、プログラムは実際にはそれらの文字を読み取らない。 –

+0

@Steve Jessop、@Je Rog:あなたが行く:-) – thkala

0

これは標準とは関係がありません。実行時には何をstdinに書き出すのかはあなた次第です。実行時には標準入力がプログラムから利用可能になり、そこからいくつかのバイトが読み込まれて終了し、残りのバイトはランタイム自体によって処理されます。プロセスをフォークした後にすべてのファイル記述子をクリアするように設定できる場合、おそらくこの動作を妨げる可能性がありますが、これは、あるプロセスの入力を別のプロセスの出力に接続することに依存する標準コマンドラインワークフローのほとんどを真剣に妨げるでしょう...

+0

この場合、(擬似)端末用のPOSIX仕様、および/またはシェル動作用のX/Open仕様という関連規格があります。 – zwol

+0

@ザック:ありがとう!知っておいてよかった。 –

関連する問題