2016-08-28 3 views
9

私はアセンブリの初心者です(nasmを使用しています)。私は大学のコースを通して組立を学んでいます。sys_readシステムコールが新しい行を検出したときに、なぜ終了するのですか?

sys_read linuxシステムコールが呼び出されたときの動作を理解しようとしています。具体的には、sys_readは、新しい行または改行を読み込むと停止します。私が教えたことによると、これは事実です。このonline tutorial articleも事実/クレームを確認します。

sys_readが改行を検出すると、制御はプログラムに戻り、ユーザー入力はECXで渡したメモリアドレスに格納されます。

sys_read呼び出しのLinuxプログラマーズ・マニュアル(「man 2 read」を使用)を調べました。それは仮定されているときの動作を言及していません、そうですか?

read()は、ファイル記述子fd から最大countバイトをbufで始まるバッファに読み込もうとします。

シークをサポートするファイルでは、読み取り操作は ファイルオフセットで開始され、ファイルオフセットは読み取りバイト数 でインクリメントされます。ファイルのオフセットがファイルの終わりまたはそれを超えている場合、バイトは であり、read()はゼロを返します。

countがゼロの場合、read()は以下のエラーを検出することがあります。 にエラーがないか、またはread()でエラーがチェックされない場合は、0のカウントを持つ read()が0を返し、それ以外の効果はありません。

countがSSIZE_MAXより大きい場合、結果は不定です。

私の質問は本当に何故起こりますか?これはLinuxカーネルの仕様で、これが起こるべきか、それは他の何かの結果ですか?

答えて

8

POSIX tty in canonical mode(バックスペースは、カーネルのttyドライバによって処理された行を「提出する」ためにreturnキーを押す前に動作します)から読み込んでいるからです。 POSIXのttyセマンティクス/ stty/ioctlを探します。 ./a.out < input.txtを実行した場合、この動作は表示されません。

TTY上のread()は、control-d(EOF tty制御シーケンス)を押すと改行なしで返されることに注意してください。read()は、行全体を読み込むと仮定すると

は、おもちゃのプログラムのためにOKですが、はあなたがTTYから読んでいることをチェックしました場合にも、堅牢にする必要があるものであると仮定しませスタートを行います。ユーザーが複数の行のテキストをターミナルエミュレータに貼り付けると、の処理が忘れられます。おそらくそれらはすべて単一のread()バッファに終わるでしょう。


my answer on a question about small read()s leaving unread data on the terminal参照してください:あなたはread()バッファサイズよりも1行に複数の文字を入力する場合は、入力をクリアするために、少なくとも1つ以上readシステムコールが必要になります。


あなたが述べたように、read(2) libcの関数はsys_read周りだけ薄いラッパーです。この質問に対する答えは、アセンブリ言語とはまったく関係がなく、C言語(または他の言語)でプログラミングするシステムでも同じです。

さらに読書:

+0

説明と参考に感謝します! – Mercado

3

これはread()システムコールの属性ではなく、ターミナルドライバのtermiosというプロパティです。デフォルトの設定では、を入力するまで、入力された文字(つまりあなたが入力したもの)をtermiosでバッファリングします。を入力します。その後、端末から読み取るプログラムに行全体が送られます。これは便利なため、回線を送信する前に編集することができます。

Peter Cordesはすでに言いましたが、このような動作は他の種類のファイル(通常のファイルのようなもの)から読み込むときには現れず、termiosを設定することで無効にすることができます。

チュートリアルではガベージとは何ですか、それを無視してください。

+0

私は最後の文が好きです:D説明のために多くのおかげで:) – Mercado

+0

@Mercadoそれは私にとって喜びです! – fuz

関連する問題