問題タブ [lseek]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - Linux でゼロを埋めずにファイルに書き込む
Linux を実行している組み込みデバイスで、後で書き込むことになる大きな穴が最初にあるファイルを作成することが目的であるとしましょう。ファイルを開き、ファイル記述子を取得し、lseek
それを呼び出して特定の既知の位置をシークします。その後、シーク先の位置でそのファイルに書き込みたい場合は、それを呼び出しますwrite
。
ただし、最初の書き込みでは、シークによって作成された穴がゼロで埋められ、穴が十分に大きい場合、この操作には時間がかかる場合があります。私のアプリケーションでは、穴は正確な長さであり、後でデータで埋めるため、このゼロ初期化は必要ありません。
write
穴をゼロで埋めた後の最初の呼び出しを回避する方法はありseek
ますか (ファイルシステムドライバーの変更を伴う場合でも)? または、ファイルの先頭の前にファイルに書き込む方法はありますか (ファイルの先頭に追加します)。
c - lseek() の戻り値
lseek()
の戻り値(新しいファイルオフセット)について混乱しました
テキスト ファイルがあります (その名前は prwtest です)。その内容は a から z に書き込まれます。
そして、私が書いたコードは次のとおりです。
number 行17
で flag を使用O_APPEND
しているため、prwtest の現在のファイル オフセットは i ノードの現在のファイル サイズから取得されます。(26歳です)。
行番号18
でlseek()
は、SEEK_CUR で使用されるものを使用し、オフセットは 0 です。
しかし、結果の値cur_offset
は 0 です (SEEK_CUR は現在のファイル オフセットを示しているため、26 である必要があるSEEK_END
と思います) cur_offset
。
lseek(fd, 0, SEEK_CUR);
戻り値が 26 ではなく 0 になるのはなぜですか?
c - バッファと lseek を使用してファイル内の文字を変更する方法
lseek と assigment のバッファの使用に問題があります。目的は、ファイルを読み取り、すべての文字「a」を「?」に変更することです。関数とバッファがどのように機能するかを理解するためにいくつかのマイナーなプログラムを実行していますが、問題が発生しています.私のファイル「teste」には「abcabcabc」しか含まれていないと想像してください。私がこれを行う場合:
コンソール「a」に乗ると、ポインタを最初に置いたので、最初の文字がよく読めます。しかし、printf の前に if 条件を実行すると、次のように buf と 'a' を比較します。
それは機能しません。何も出力しないため、if ステートメントに入りません。ファイルのすべての「a」を変更できるように、バッファを文字と比較する必要があります。これを行うにはどうすればよいですか彼ら?
わかりました、この部分は以下の回答によりすでに解決されていますが、今はすべてのファイルを読み込んで各文字を「a」と比較し、機能しているかどうかを確認するためだけに単純な printf を作成しようとしています..私はこれを書きました:
しかし、現在は機能しています.1つの「a」のみを出力し、閉じず、何もしません..無限サイクルのようですが、ifステートメントを入力しません。どうしたの?
linux - lseek を実装するためのカスタム SPI ドライバー
カスタム ハードウェア用の SPI ドライバーを実装しようとしています。私は spidev ドライバーのコピーから始めました。これは、私が必要とするほとんどすべてをサポートしています。
コマンドビット(読み取り/書き込み)、アドレス、および任意の量のデータの3つの部分を持つプロトコルを使用しています。
これを行うには、単純に lseek 機能を追加するのが最善の方法であると想定していました。目的のアドレスを「シーク」してから、任意の数のバイトを読み書きします。新しいドライバーの file_operations でカスタム .llseek を作成しましたが、その関数が呼び出されるのを見たことがありません。fseek()、lseek()、および pread() を使用してみましたが、これらの関数のいずれも新しい my_lseek() 関数を呼び出していないようです。すべての呼び出しで「errno 29 ESPIPE Illegal Seek」が報告されます
デバイスは board.c ファイルで定義されています。
主に私が見つけた例が filp->f_pos を参照しているため、devファイルが作成される方法に何かがあるのではないかと思います
私の質問は次のとおりです。このドライバー (わずかに変更された spidev) が「シーク」呼び出しをサポートする方法はありますか? どの時点で errno 29 を返すように定義されますか? 新しいドライバーから始めなければならず、spi_board_info() と spi_register_board_info() のセットアップに頼ることができなくなりますか?
/drivers/spi ディレクトリ (spi-dw) 内の 1 つのドライバーのみが lseek を参照し、default_llseek 実装を使用します。すべてを立ち上げて実行するために私たちが思いついた「ハック」がいくつかありますが、私はそれを正しく行う方法を学びたい傾向があります.
どんな提案でも大歓迎です!(PS、OMAP Android システムのカーネル バージョンは 3.4.48 です)
c - ファイルのロック + Fscanf/Lseek
いくつかの値を保持する「input.txt」というファイルがあります。そのファイルで最小値を見つけ、その最小値をコマンドライン引数として指定された数値に置き換えるプログラムを書いています-そのコマンドライン引数が最小値よりも大きい場合。これらの値は室温を表すため、事実を使用して最小値を見つけることができます。さらに、ファイルのその部分 (新しい番号が最小値に置き換わる場所) をロックする必要があります。
例:
ファイル: 21 25 19 22 24
ファイル: 21 25 23 22 24
ファイル: 21 25 23 22 24
ファイル: 29 25 23 22 24
コード:
ただし、これは機能しません。ファイルは変更されません。問題は、これが正しい方法であることを知っていることです。私は基本的に、単語"aa"の出現ごとに"bb"に変更する同じプログラムを作成しました。基本的に同じコンセプトです。
私はもう試した:
- ループの前後にオフセットをフェッチしようとしまし
fscanf()
た 。while()
最初のfscanf
オフセットが 0 に設定される前 - ファイルの先頭。最初のfscanf
オフセットがファイルの最後に設定された後、各反復の後、オフセットはファイルの最後に残ります。 ftell()
これらと同じものを使用しprintf()
てみましたが、ftell()
正しいオフセットが得られます。ただしftell()
、 while ループではまだファイルの終わりが返されます。私もfseek()
代わりに 使用してみました(実装での使用lseek()
を知っていても)。それでも同じ結果。fseek()
lseek()
char*
値の代わりにバッファを使用してみました。基本的にはfscanf(file,"%s",buffer)
、その値を変換して読み取り値が最小かどうかを確認し、その後、それfprintf(file,"%s",buffer)
を記述するのに使用しました。でも同じ結果。- ファイル全体をロックしようとしましたが(おそらく問題があると思いました)、同じ結果になりました。
コード:
これは、同じ概念を使用する、私が言及した2番目のプログラムです。このコードは機能しますが、ここでもオフセットを印刷しようとしましたが、オフセットもファイルの最後にあります。
ご覧のとおり、まったく同じ概念です。2 番目のプログラムは機能しますが、最初のプログラムは機能しません。
私は今とても混乱しています。ファイルストリームからファイル記述子を作成lseek()
し、そのファイル記述子を使用してオフセットを変更すると、ストリームのオフセットも変更されますか? fscanf()
また、ストリームから何かを読み取るために使用する場合offset_t
、ファイルから読み取るのと同じくらい変更しますか? fscanf()
フォーマット指定子%d
とを使用する場合、オフセットの変更に違いはあり%s
ますか?
append - lseek がファイルの追加モードで動作しない
これは私のコードです。引数として指定されたファイルを開き、ファイルの先頭にコンソールからすべてを書き込む必要があります。ファイルは追加モードで開かれ、lseek を使用して記述子を先頭に移動します。f1 の値に変更はなく、lseek が失敗したと出力されます。
c - lseek() を適切に使用してファイルサイズを拡張するには?
lseek()
必要なサイズのファイルを作成しながら、の使用を真に理解しようとしています。そこで、input で指定されたサイズのファイルを作成することを唯一の目的とするこのコードを書きました。
たとえば、次のように実行します。
myFile
最後のバイトが数字の 5 で占められている 5 バイトという名前のファイルを作成することを期待しています。取得したファイルは、アクセスすることさえできません。どうしたの?lseek()
使用法 をひどく解釈しましたか?