Linux lseek関数の使い方の詳しい説明

Linux lseek関数の使い方の詳しい説明

注:記事に誤りがある場合は、メッセージを残して指摘してください。ご協力ありがとうございます。

名前

名前: lseek - 読み取り/書き込みファイルのオフセットを再配置する

lseek 関数は、ファイルの読み取りと書き込みの変位を再配置するために使用されます。

ヘッダーファイルと関数宣言

#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t オフセット, int whence);

オフセットが正の場合、ファイルの末尾に向かって移動します (前方に移動)。負の場合、ファイルの先頭に向かって移動します (後方に移動)。

説明する

lseek() は、次のように whence ディレクティブに従って、ファイル記述子 fd に関連付けられたオープン ファイル記述のファイル オフセットを引数オフセットに再配置します。
SEEK_SET ファイルオフセットは offset バイトに設定されます。
SEEK_CUR ファイル オフセットは、現在の場所にオフセット バイトを加えた値に設定されます。
SEEK_END ファイル オフセットは、ファイルのサイズにオフセット バイトを加えたサイズに設定されます。

lseek() を使用すると、ファイル オフセットをファイルの末尾を超えて設定できます (ただし、これによってファイルのサイズは変更されません)。この時点で後でデータが書き込まれると、ギャップ (「ホール」) 内のデータのその後の読み取りでは、ギャップにデータが実際に書き込まれるまで、ヌル バイト ('\0') が返されます。

lseek() 関数は、開いたファイルのオフセットを再配置します。オフセットは、offset パラメータと whence パラメータの組み合わせによって決定されます。

シークセット:
オフセットはファイルの先頭からの offset バイトです。
シーク_CUR:
ファイルの現在の読み取り/書き込みポインターの位置から開始して、オフセットを offset バイトだけ増加します。
終了:
ファイル オフセットは、ファイルのサイズにオフセット バイトを加えたサイズに設定されます。

テストコード:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>

#BUFFER_SIZE 1024 を定義します
#define SRC_FILE_NAME "src_file"
#define DEST_FILE_NAME "dest_file"
//渡されたパラメータに応じてオフセットを設定します
#OFFSET (atoi(args[1])) を定義します 

int main(int argc, char*args[]) {
  int src_file、dest_file;
  符号なしcharバッファ[BUFFER_SIZE];
  実際の読み取り長さ、オフセット;
  (引数が2の場合){
    fprintf(stderr, "使用法: %s オフセット\n", args[0]);
    終了(-1);
  }
  src_file = open(SRC_FILE_NAME、O_RDONLY);
  dest_file = open(DEST_FILE_NAME, O_WRONLY | O_CREAT, S_IREAD | S_IWRITE); //所有者権限: rw
  (ソースファイル < 0 || 宛先ファイル < 0)の場合 {
    fprintf(stderr, "ファイルオープンエラー!\n");
    終了(1);
  }
  off_set = lseek(src_file, -OFFSET, SEEK_END); //ここでオフセットが否定されていることに注意してください printf("lseek() は src_file のファイル オフセットを返します: %d\n", off_set);
  real_read_len = read(src_file, buff, sizeof(buff)) > 0 である間、
    書き込み(dest_file、バッファ、real_read_len);
  }
  dest_file を閉じます。
  src_file を閉じます。
  0を返します。
}

結果の解釈

dest_file ファイルと src_file ファイルのオフセットとサイズを観察すると、プログラムが lseek 関数を使用して src_file ファイル ポインターをファイルの末尾 + オフセットに再配置し (このプログラムはオフセットの反対の数、つまりファイルの末尾 + (-offset) を取得することに注意してください)、ファイルの末尾 + オフセットから dest_file へのファイルのコピーを開始することが簡単にわかります。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Linuxのアラーム機能の例の説明
  • PHP は 6 つの Linux コマンド関数コード例を実行します
  • Linux での stat 関数と stat コマンドの使用法の詳細な説明
  • Linux で time(NULL) 関数と localtime() を使用して現在の時刻を取得する方法
  • Linux/Mac で Python 関数にタイムアウトを追加する方法
  • Linux のリンク解除機能とファイルの削除方法
  • ARMアーキテクチャにおける関数呼び出しプロセスの簡単な分析

<<:  フロントエンド JavaScript でローカルあいまい検索機能を実装する方法の例

>>:  MySQLで数千万のテストデータを素早く作成する方法

推薦する

HTML テーブルタグチュートリアル (19): 行タグ

<TR> タグの属性は、次の表に示すように、テーブル内の各行のプロパティを設定するために...

Linux で gdb を使用してコア ファイルをデバッグする方法

1.コアファイルプログラム実行中にセグメンテーション エラー (コア ダンプ) が発生すると、プログ...

ウェブページの幅を携帯電話の画面(ビューポート)の幅に自動的に適応させる実装コード

一般的な書き方は次のとおりです。 XML/HTML コードコンテンツをクリップボードにコピー<...

Vue3とTypeScriptを組み合わせたプロジェクト開発の実践記録

目次概要1. コンポジションAPI 1. ref と reactive の違いは何ですか? 2. 周...

ウェブサイトを構築するときは、UTF-8 または GB2312 エンコードを使用する必要がありますか?

外国のウェブサイトを開くと文字化けした文字が表示されることが多く、また、英語以外の外国のウェブサイト...

Vue の状態管理: Vuex の代わりに Pinia を使用する

目次1. ピニアとは何ですか? 2. Piniaは使いやすい3. ユーザーエクスペリエンス1. ピニ...

CSS を使用して複数の方法で等高レイアウトを実装するサンプル コード

この記事で説明する等高レイアウトでは、純粋な CSS を使用して、要素の高さを手動で設定することなく...

Vue で Excel インポート機能を実装する詳細な手順

1. フロントエンド主導の実装手順最初のステップは、ページのインポートボタンをクリックしてExcel...

nginxリバースプロキシを使用するときに長時間接続を維持する方法

・【シーン説明】 HTTP1.1 以降、HTTP プロトコルは永続的な接続 (長い接続とも呼ばれます...

CocosCreator の新しいリソース管理システムの分析

目次1. 資源と建設1.1 クリエイターリソースファイルの基本1.2 リソースの構築2. アセットバ...

入力ボックスのカーソルサイズの表示が一貫していない問題の解決方法

入力ボックス内のカーソルのサイズが一定ではありませんIE7とChromeの違いは非常に明白ですまず、...

SQL GROUP BYの詳細な説明と簡単な例

GROUP BY ステートメントは、Aggregate 関数と組み合わせて使用​​され、1 つ以上の...

MySQL パスワードは正しいが、ローカルにログインできない -1045

MySQLパスワードは正しいが、ローカルでログインできない -1045 ユーザー 'roo...

Vueは画像のドラッグアンドドロップ機能を実装します

この記事の例では、画像のドラッグアンドドロップ機能を実現するためのVueの具体的なコードを参考までに...

JavaScript のディープコピーの落とし穴

序文以前、ある会社の面接に行ったとき、面接官から「オブジェクトを深くコピーするにはどうすればよいです...