インポートする必要があるヘッダー ファイル: #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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: CSS3 フィルター (フィルタ) ウェブページのグレーまたは黒モードのサンプルコードを実現
CSS スタイルを使用して表内のフォントを垂直方向に中央揃えする方法は次のとおりです。下図のようなカ...
Linux システムでは、chmod コマンドと chown コマンドの両方を使用して権限を設定でき...
序文:パーティショニングはテーブル設計パターンです。一般的に、テーブル パーティショニングとは、条件...
Linux CentOS 7.7 システムを Vmware にインストールする方法。最小限のインスト...
環境ホスト名IPアドレス仕えるプロメテウス192.168.237.137プロメテウス、グラファナノー...
1. Ubuntu Server 18.04.5 LTS システムのインストールUbuntuはデスク...
1. マインドマップ 2. コンテナの構築方法2.1 実験環境の準備(1)環境選択管理ツール: D...
序文MySQL クエリは select コマンドを使用し、limit および offset パラメー...
問題: MySQLテーブル内の自動増分IDのオーバーフローによりビジネスブロックが発生した背景: t...
目次単一コンテンツ投影マルチコンテンツ投影単一条件のコンテンツ投影アプリ-人物-htmlアプリ担当者...
この記事では、参考までに、NFC読み取り機能を実装するためのuni-appの具体的なコードを紹介しま...
Autotrash は、古い削除済みファイルを消去するプロセスを自動化するコマンド ライン プログラ...
Ubuntu 18のインストール中に、USBディスクからUbuntuのインストールを開始すると、mm...
序文この記事は主にubantu 16.4 Hadoop完全分散構築に関する関連コンテンツを紹介し、皆...
状況の説明: データベースが異常に起動およびシャットダウンしたため、サービスを再度起動したときに「起...