Unixで関数を探す

Unixで関数を探す

理解しようとする検索(2) 機能Unixバージョン6から始めます。

この例:

seek(0,0,2)

したがって、最初のパラメータはファイル記述子です。 0は標準入力になります。 2番目のパラメータはオフセット(0)です。 3番目のパラメータはマニュアルページに従って "ポインタは、ファイルサイズにオフセットを加えた値に設定されます。

しかし、なぜこのようなことをしますか?なぜファイルの後ろを指しているのですか?

ラインはソースコード

答え1

seek(0, 0, 2)ファイル記述子0によってバッファリングされたすべてのデータはスキップされます。したがって、このコマンドの後にこのファイル記述子から次回を読むいいえバッファリングされた内容を読みます。

コードを調べて実際の目的が何であるかを見ると、ファイル記述子0が通常標準入力であるにもかかわらず、プログラムがそのファイル記述子を介して読み取るスクリプトの一部である場合にのみ実際に動作することがわかります。

たとえば、次のスクリプトを見てください。

goto
echo "hello"

パラメータがないとgoto検索が開始されます。

seek(0, 0, 2)コマンドなしで終了すると、コマンド呼び出し側はスクリプトから次のコマンドを読み取るため、スクリプトgotoはまだコマンドを実行します。echo "hello"goto

答え2

エラー状態のため、返す前に標準入力を巻き戻したい場合があります。

if (argc<2 || ttyn(0)!='x') {
    write(1, "goto error\n", 11);
    seek(0, 0, 2);
    return;
}

答え3

seekfseekファイル(ファイル記述子(seek)またはファイルポインタ(fseek))の現在の場所を変更します。 Cでは主にfseekを使用します。ファイルの終わりから始まる/ fseek(SEEK_END)の一般的な用途は次のとおりです。

ファイルの終わりの場所 =seek(f,0,2) or fseek(f,0,2)

ファイルサイズの計算 = fseek(f,0,2); size=ftell(f)

ファイルの終了位置から20を引いた値=fseek(f,-20,2)

一部の「ファイル」は元に戻せません

答え4

オフセットがゼロなのでファイルの後ろではないため、ファイルの終わりを指し、通常はファイルにデータを追加するために使用されます。

これは、書き込まれたが読み取られていない入力をオーバーライドするためにstdinを介して行われます。バッファと呼ばれるのは、stdinがパイプの場合、これ以上読み取れなくなるまで読み込まれるため、不正確です。
passwdコマンドは、パスワード自体の一部ではない入力(Enterキーを繰り返し押すなど)を防ぎ、パスワードと対話するデフォルトのスクリプトを防ぐためにこれを行います。

関連情報