詳細な読み取りと書き込みのファイルとLinuxでのサンプルコード|組込みLinuxアプリケーション開発ピース--01

1. Linuxは「すべてがファイルです」

Linuxシステムでは、すべてがファイル、それが表す意味に基づいて、ファイルの種類がある、に分かれています。

  • 簡易ファイル
  • デバイスファイル:特定のハードウェアデバイスを表します
  • パイプラインファイル、FIFOファイル:ファイルには、プロセス間通信のための特別な意味を持っています。
  • ソケットファイル:ネットワーク。

これらのファイルのすべてが、APIのセットを操作するために使用することができ、APIは基本的な4次のとおりです。

  • オープン:オープン
  • 読み込みファイル:読み取り
  • 書き込みファイル:書き込み
  • クローズ:クローズ

ファイルの操作これらのAPIを使用する場合は、あなたが入ってくるファイル識別子のFD(ファイルディスクリプタ)を必要とする、コードの性質は、特定のプロセスでのファイルの整数ファイル識別子であるファイルを開くには、open関数を使用している場合、一意に割り当てられ、 FDの値は0から割り当てられている場合、FDが負の場合、一般的に、それは故障やファイルオープン動作が失敗を示しています。

閉じる閉じるファイルを使用した場合、ファイルを開くを使用して開かれたときに値FDが一意に割り当てられていることに注意してくださいは、リサイクルされます。たとえば、ファイルが閉じている場合は、ファイルに割り当てられた値のfd = 0を最初に開いたときなどは、新しいファイルが開かれる次回は、fdはまだゼロですが、ファイルがクローズアウトの前に開かれていない場合、次のその後時間が新しいファイルを開いたときにインクリメントアップファイルを開くためにシステムによって最大セットまで、この最大値を使用することができるが、fdは、1にインクリメントされulimit -n、通常1024、ビューに。

また、ファイルディスクリプタ0、1の値は、システムによって占められ、彼は、デスクトップLinuxシステムで述べています:

  • FD = 0:標準入力(STDIN)、システムのキーボードに対応
  • FD = 1:システムに対応し、表示の標準出力(stdout)であります
  • FD = 2:システムに対応し、標準エラー表示出力(標準エラー)を表します

組み込みLinuxシステムでは、何のディスプレイとキーボードは、一般的に存在しない、シリアルポートは次のように値が3つのデバイスに対応するように、インタラクティブです。

  • FD = 0:システムに対応し、シリアルコンソール標準入力(STDIN)を示します
  • FD = 1:システムに対応し、シリアルコンソール標準出力(stdout)を示し
  • FD = 2:システムに対応し、標準エラー出力シリアルコンソール(標準エラー)を表します

2. LinuxのCライブラリは、ファイル操作APIを提供します

2.1ヘッダ

ファイル操作APIを使用するときは、まず次のヘッダーが含まれている必要があります。

#include <sys/types.h>		//定义了一些常用数据类型,比如size_t
#include <fcntl.h>			//定义了open、creat等函数,以及表示文件权限的宏定义
#include <unistd.h>			//定义了read、write、close、lseek等函数
#include <errno.h>			//与全局变量errno相关的定义
#include <sys/ioctl.h>		//定义了ioctl函数 

2.2オープン - 。ファイルを開きます

次のようにファイル記述子fdを取得し、操作ファイルの前に開いている必要があり、関数のプロトタイプは次のとおりです。

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

次のように①パラメータは次のとおりです。

  • パス名:ファイルパス+ファイル名
  • フラグ:ファイルを開きます
  • モード:ファイルのアクセス権を開きます。
  • 戻り値int型:戻りファイルディスクリプタが正常に開かれ、-1故障が開き、エラーの原因を示すためにグローバル変数errnoを設定することで、

バリュー②フラグフラグはで使用することができます<fcntl.h>マクロ定義:

  • O_RDONLY:読み取り専用
  • O_WRONLY:のみ書きます
  • O_RDWR:リード・ライト(共通)
  • O_CREAT:あなたが存在しないファイルを開きたい場合は、新しいファイルを作成します
  • O_EXCL:あなたは、ファイルがすでに存在している使用している場合はO_CREAT、エラー・メッセージが返されます
  • O_TRUNC:ファイルがすでに存在している、と正常にオープン、元のデータファイルのすべてが削除された場合
  • O_APPEND:追記書き込みモードでファイルを開いた後、ファイルの末尾にファイルポインタを開きます

開口部は、使用することができる|ようなオペレータ、一緒に使用し、:

O_RDWR | O_CREAT

値③モードを使用すると、新しいファイルを作成するときに表現する8進数で、設定されたアクセス権を示し、あなたは<fcntl.h>表現するために定義されていますが、進数は便利なマクロを使用することができます。

ファイルのlinuxで3つの権限に対応する3ビット進数:

rwxrwxrwx

第RWXは、第2のユーザ・グループ・パーミッションRWXファイルが他のユーザグループに第RWX権限に属する、ファイル所有者の権限です。

各rwxの対応進数:などなどを0x7など、そこにrwxの3つの完全な権限を言い、0x0のは、それが3社のrwxの許可を意味し、そこではありません、

  • 0700:あなたのユーザーはrwxの権限、ユーザグループと、現在のユーザー・グループの他のユーザーがいずれかの権限を持っていない持っています。
  • 0664(共通):ユーザーが権限rw-が持っている( - そのような対応の権限を示していない)、他の現在のユーザーのグループが許可rw-、他のユーザーグループのユーザーのみR-権限を持っています。

。2.3読み取り - ファイルを読みます

次のように関数のプロトタイプは次のとおりです。

ssize_t read(int fd, void *buf, size_t count);

次のように関数のパラメータは次のとおりです。

  • FD:ファイルディスクリプタ
  • BUF:リードデータバッファを受信するための
  • カウント:バイト数が要求を読みます
  • 戻り値:読み取りがファイルの末尾に返されるバイト数の読み取り成功を読み出して返します0、-1読んで、エラーの原因を示すためにグローバル変数errnoを設定するために失敗した場合。

ファイルを書き込む - 2.4書き込み。

次のように関数のプロトタイプは次のとおりです。

ssize_t write(int fd, const void *buf, size_t count);

次のように関数のパラメータは次のとおりです。

  • FD:ファイルディスクリプタ
  • BUF:書き込まれるデータを格納するバッファ
  • カウント:バイト数が書き込まれるように要求されました
  • 戻り値:実際に書き込まれたバイト数正常に書き込まれているが返され、書き込みが失敗-1が返され、エラーの原因を示すためにグローバル変数errnoが設定されています。

2.5に近い - 。ファイルを閉じます

次のようにAPIのプロトタイプは次のとおりです。

int close(int fd);

関数のパラメータは、ファイル記述子fdファイルを閉じることを約束しました。

あなたが成功したリターン0を閉じると、そうでない場合は-1を返し、グローバル変数errnoがエラーの特定の理由を報告して設定します。

3.操作の例のプログラムファイル

機能の例:

現在のディレクトリTEXT.TXTでファイルを開き、それを作成するために存在しない場合は、最初の文字列を記述して、[閉じるファイル、およびそのファイルとプリントの内容を読んで再度開きます。

サンプルコード:

/**
 * @brief  文件读写API使用示例程序
 * @author Mculover666
 * @note   首先写入文件,接着读取文件
*/

#include <sys/types.h>		//定义了一些常用数据类型,比如size_t
#include <fcntl.h>			//定义了open、creat等函数,以及表示文件权限的宏定义
#include <unistd.h>			//定义了read、write、close、lseek等函数
#include <errno.h>			//与全局变量errno相关的定义
#include <sys/ioctl.h>		//定义了ioctl函数 
#include <stdio.h>

int main(void)
{
    int fd = -1;
    int res = 0;

    char filename[]  = "test.txt";
    char write_dat[] = "Hello World!";
    char read_buf[128] = {0};

    /* 写入文件操作示例 */
    //1. 打开文件
    fd = open(filename, O_RDWR | O_CREAT, 0664);
    if(fd < 0)
    {
        printf("%s file open fail,errno = %d.\r\n", filename, errno);
        return -1;
    }

    //2. 读取内容
    res = write(fd, write_dat, sizeof(write_dat));
    if(res < 0)
    {
        printf("write dat fail,errno = %d.\r\n", errno);
        return -1;
    }
    else
    {
        printf("write %d bytes:%s\r\n", res, write_dat);
    }

    //3. 关闭文件
    close(fd);

    /* 读取文件数据示例 */
    //1. 打开文件
    fd = open(filename, O_RDONLY);
    if(fd < 0)
    {
        printf("%s file open fail,errno = %d.\r\n", filename, errno);
        return -1;
    }

    //2. 写入内容
    res = read(fd, read_buf, sizeof(read_buf));
    if(res < 0)
    {
        printf("read dat fail,errno = %d.\r\n", errno);
        return -1;
    }
    else
    {
        printf("read %d bytes:%s\r\n", res, read_buf);
    }

    //3. 关闭文件
    close(fd);

    return 0;
}

コンパイルします。

gcc 01-file_test.c -o 01-file_test.o

実行します。

4.組込みLinux開発ボードのテスト実行に移植しました

4.1オプティマイザ - のfsync

システム内部バッファへのデータの提出後に返され、それが返すときに、組み込みシステムは、突然の停電ならば、データが失敗したファイルに書き込まれます - 組み込みLinuxシステムは、典型的には、フラッシュメモリ、書き込みを()に問題があり使用します。

そのため、組み込みシステムでこれらのAPIを使用した場合、それは書き込み機能の後でなければなりません、のfsync()関数を使用すると、すぐにデータの損失を回避するために、フラッシュメモリに書き込まれた変更されたファイルデータです

次のように<unistd.h>、プロトタイプの関数プロトタイプでFSYNC()関数です。

int fsync(int fd);

ファイルがリターン-1、グローバル変数errnoがエラーの特定の理由を報告したセットにディスク戻り、戻り成功時に0、失敗に書き込まれたデータを修正されるまでのfsync()は、すべての後に呼び出した後、になります。

サンプルプログラムの書き込み動作の後にコードを追加します。

//写入之后立马同步数据
res = fsync(fd);
if(res < 0)
{
    printf("fsync fail,errno = %d.\r\n", errno);
    return -1;
}

4.2は、開発ボードで実行するように移植しました

①使用クロスコンパイルツールは、プログラムを再コンパイル:

arm-none-linux-gnueabi-gcc 01-file_test.c -o 01-file_test_arm.o

②NFSファイルシステム、開発ボードへの実行可能ファイル

cp 01-file_test_arm.o /nfs_root/

③開発ボードは、プログラムのテストを実行します:

./01-file_test_arm.o

開発ボードの結果を次のように

受け、よりエキサイティングな記事やリソース押しは、私のマイクロチャンネル公衆番号に加入することを歓迎:「mculover666」

公開された259元の記事 ウォンの賞賛661 ビュー290 000 +

おすすめ

転載: blog.csdn.net/Mculover666/article/details/104817798