ファイル操作のためのLinuxシステムコール

ファイル操作のためのLinuxシステムコール

インポートする必要があるヘッダー ファイル:

#include <unistd.h>

1. ファイルを開く

既存のファイルを開く

int open(const char *パス名、int フラグ);

新しいファイルを作成し、権限を作成する

int open(const char *pathname, int flags, mode_t mode);

パラメータの紹介

パス名: 開くファイルのパスと名前

フラグ: オープンフラグ

ロゴ紹介:

引数フラグには、次のいずれかのアクセス モードを含める必要があります。
O_RDONLY、O_WRONLY、またはO_RDWR。これらは、ファイルを読み取り専用で開くことを要求します。
それぞれ、読み取り専用、書き込み専用、または読み取り/書き込みです。

O_RDONLY 読み取り専用で開く

O_RDWR 読み取りと書き込み用にオープン

O_CREAT ファイルが存在しない場合は作成する

O_APPEND ファイルの末尾に追加します

O_TRUNC ファイルをクリアしてモードを書き換えます

mode には次の記号定数が用意されています。

S_IRWXU 00700 ユーザー(ファイル所有者)には読み取り、書き込み、実行の権限があります
                       

S_IRUSR 00400 ユーザーに読み取り権限がある

S_IWUSR 00200 ユーザーに書き込み権限がある

S_IXUSR 00100 ユーザーに実行権限がある

S_IRWXG 00070 グループには読み取り、書き込み、実行の権限があります

S_IRGRP 00040 グループに読み取り権限がある

S_IWGRP 00020 グループには書き込み権限があります

S_IXGRP 00010 グループには実行権限があります

S_IRWXO 00007 他の人は読み取り、書き込み、実行権限を持っています

S_IROTH 00004 他の人は読み取り権限を持っています

S_IWOTH 00002 他の人は書き込み権限を持っています

S_IXOTH 00001 他の人に実行権限がある

戻り値: ファイル記述子

2. ファイルの読み取り

ssize_t 読み取り(int fd、void *buf、size_t カウント);

パラメータの紹介

fd: 対応するオープンファイル記述子 buf: データを格納するためのスペース count: 一度にファイルから読み取る予定のデータのバイト数 戻り値: 実際に読み取られたバイト数

3. ファイルを書き込む

ssize_t 書き込み(int fd, const void *buf, size_t カウント);

パラメータの紹介:

fd: 開かれたファイル記述子に対応 buf: 書き込まれるデータを格納する count: 一度にファイルに書き込まれる予定のデータ量

4. 閉じる

int 閉じる(int fd);

fd: 対応するファイル記述子

分析の質問

親プロセスが最初にファイルを開いた場合、子プロセスはフォーク後にそのファイルを共有できますか?

ファイルの内容

ここに画像の説明を挿入

コード

#include <stdio.h>
#include <unistd.h>
#include <assert.h>
#include <fcntl.h>
#include<stdlib.h>

int メイン()
{
    char バフ[128] = {0};

    int fd = open("myfile.txt", O_RDONLY);

    pid_t pid = fork();
    アサート(pid != -1);

    (pid == 0)の場合
    {
        読み取り(fd, バッファ, 1);
        printf("子バフ = %s\n", バフ);

        睡眠(1);
        読み取り(fd, バッファ, 1);
        printf("子バフ = %s\n", バフ);

    }
    それ以外
    {
        読み取り(fd, バッファ, 1);
        printf("親バフ = %s\n", バフ);

        睡眠(1);
        読み取り(fd, バッファ, 1);
        printf("親バフ = %s\n", バフ);
    }

    閉じる(fd);

    終了(0);
}

実行結果:

ここに画像の説明を挿入

結論は

fork によって作成された子プロセスの PCB は親プロセスのコピーであるため、子プロセスの PCB 内のファイル テーブル内の開いているファイルへのポインターは、親プロセスの PCB 内の値をそのままコピーします。そのため、親プロセスと子プロセスは、親プロセスが fork する前に開かれたすべてのファイル記述子を共有します。

ここに画像の説明を挿入

演習

ファイルのコピーを完了します(コマンド:cpと同様)

元のファイルの内容は次のとおりです。

ここに画像の説明を挿入

コード:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include<stdlib.h>
#include <assert.h>

int メイン(void)
{
    char バフ[128] = {0};

    int fdr = open("myfile.txt", O_RDONLY);
    アサート(fdr != -1);

    int fdw = open("newfile.txt", O_WRONLY | O_CREAT, 0600);
    アサート(fdw != -1);

    整数n = 0;
    (n = read(fdr, buff, 128) > 0) の場合
    {
        書き込み(fdw,バッファ,n);
    }

    閉じる(fdr);
    閉じる(fdw);
    
    終了(0);
}

例を実行する:

newfile.txtが正常に作成されたことがわかります

ここに画像の説明を挿入

システムコールとライブラリ関数の違い

違い: システム コールの実装はカーネル内にあり、カーネル空間に属しますが、ライブラリ関数の実装は関数ライブラリ内にあり、ユーザー空間に属します。

システムコール実行プロセス:

ここに画像の説明を挿入

これで、ファイル操作のための Linux システム コールに関するこの記事は終了です。Linux のファイル システム コールの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Linuxシステムコール原理の詳細な説明
  • Linux システムコールを実装する 3 つの方法

<<:  CSS3 フィルター (フィルタ) ウェブページのグレーまたは黒モードのサンプルコードを実現

>>:  HTMLのタグについての簡単な説明

推薦する

CSS3 は、跳ねるボール効果を実現する Web アニメーションを作成します。

基本的な準備この実装には、クラス名が ball である単純な div が必要です。 HTMLコード:...

MySQL 8.0.22 の最新バージョンのダウンロードとインストールの超詳細なチュートリアル (Windows 64 ビット)

目次序文1. 公式サイトからMySQL 8.0.22をダウンロードする2. 環境変数を設定する3. ...

...

CSS テキスト装飾 text-decoration と text-emphasis の詳細な説明

CSS では、テキストは私たちが毎日扱う最も一般的なものの 1 つです。テキストの場合、テキストの装...

Vue でカスタムパスのエイリアスを設定する方法

Vue でカスタム パス エイリアスを設定する方法日常の開発では、モジュールやコンポーネントをインポ...

Linux のロード vmlinux デバッグ

gdb を使用してカーネル シンボルをロードする arm-eabi-gdb 出力/ターゲット/製品/...

JQueryはアニメーション効果の非表示と表示を実装します

この記事では、アニメーション効果の非表示と表示を実現するためのJQueryの具体的なコードを参考まで...

MySQL 結合テーブルと ID 自動増分の例の分析

結合の書き方左結合を使用する場合、左側のテーブルが必ず駆動テーブルになりますか? 2 つのテーブルの...

テキストエリアのテキストをHTMLに変換する方法、つまり復帰改行について

説明: テキストエリアの値の改行を新しい行に変更しますコードをコピーコードは次のとおりです。 <...

Webフロントエンド開発におけるエラーを見つけるための基本的な考え方

WEB開発は主に2つのインタラクション(B/Sデータ)から構成されますブラウザ: 1html、css...

Linuxシステムでノードプロセスを実行しているが、プロセスを強制終了できない問題を解決します

まず、Linux システムで実行されているノード プロセスはプロセスを強制終了できないことを紹介しま...

jsを使用してサーバーに写真をアップロードする

この記事の例では、参考のために画像をサーバーにアップロードするためのjsの具体的なコードを共有してい...

Linux でログインタイムアウト後に非アクティブなユーザーを自動的にログアウトする

方法1: .bashrcまたは.bash_profileファイルを変更するこれは、ホーム ディレクト...

Reactのdiffアルゴリズムの詳細な分析

Reactのdiffアルゴリズムの理解diffアルゴリズムは、 Virtual DOMの変更された部...

Docker コンテナのマウントディレクトリ操作の表示

Dockerコンテナのマウントディレクトリ情報のみを表示する docker 検査 --format ...