IOとIO標準のシステムコール

1.システムは、IO(非緩衝IO)を呼び出します

システムコール

すべてがファイルで、ファイル操作は、LinuxでのLinuxである非常に重要です。Linuxカーネルは、ファイルやデバイスのアクセス制御のためのカーネル・インタフェースと対話するためのユーザー・プロセスのセットを提供し、このような理由から、これらのインタフェースは、システムコールと呼ばれています。

システムは、その最大の衝撃用途のために呼び出します。

  • 均一な方法では、抽象インタフェースにアクセスするアプリケーションのためのファイルのセットを提供し、アプリケーションが関係する特定の種類のファイルを必要としない、それは、その内部実装の詳細を気にしません。

一般的なシステムは、IO関数を呼び出し

、オープンクローズ、読み取り、書き込み、IOCTL、非通話システムIO関数のlseekに加えて、システムコールがIO IOバッファリングされていません。IO機能一般的に使用されるシステムコールは5を持っています。

開いた

新しいファイルを作成するために開いたり、既存のファイルを開いて、非負のファイルディスクリプタfdを返します。
STDIN_FILENO、STDOUT_FILENO、STDERR_FILENOを表す0,1,2システム定義済みのファイル記述子。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

//成功返回文件描述符,失败返回-1
int open(const char *pathname, int flags, ... /* mode_t mode */);

flagsパラメータは、一般指定O_RDONLY、O_WRONLY O_RDWRで、次も必要とされ得るか、または定数に選択されます。

  • O_CREAT:ファイルがそれを作成し、存在しない場合、この場合は、図2に示すようにモードの値と意味を設定することができ、第3モードのパラメータを必要とします。
  • O_APPENDは:ファイルの最後にあなたが書くたびに追加されます
  • O_NONBLOCK:オープン操作コマンドとその後の動作が非ブロッキングIOを設定するように、パス名は、FIFO、ブロック特殊文字特殊ファイルやドキュメントに対応している場合

閉じる

開いているファイルを閉じることがあります。

#include <unistd.h>

//成功返回0,失败返回-1
int close(int fd);

プロセスが終了すると、カーネルが自動的にアプリケーションが多くの場合、明示的にファイルを閉じずに、それを使用し、そのすべての開いているファイルを閉じます。

読む

開かれたファイルからデータを読み込むための読み。

#include <unistd.h>

//成功返回读到的字节数;若读到文件尾则返回0;失败返回-1
ssize_t read(int fd, void *buf, size_t count);

読み出し動作は、成功したリターンの前に、ファイルの現在のオフセットから開始し、実際に読み込まれたバイトのファイルオフセット数が増加します。
:いくつかの条件は、バイト数が要求を読んで実際のバイト数よりも少ない読み引き起こす可能性があります

  • 通常のファイルを読み込む場合、読み込み前に必要なバイト数が最後に到達しました。次の読み取りは直接戻り0を呼び出すときに、例えば、ファイルの終わりから30のバイトが100のバイトを読み取るために必要とされるがあり、リードは、30を返し
  • ネットワークからの読み取り時に、ネットワークバッファリング機構は、読み込まれたバイトの必要数未満の戻り値をもたらすことができる、解決策は、ネットワークプログラミングのトピックを再訪

書く

ファイルにデータを書き込むために書きます。

#include <unistd.h>

//成功返回写入的字节数,失败返回-1
ssize_t write(int fd, const void *buf, size_t count);
  • そうでない場合、それはエラーを示し、戻り値は通常、引数の数と同じである書きます。
  • 通常のファイルの場合、操作は、ファイルの現在のオフセットから始まる書きます
  • O_APPENDオプションが指定されている場合は、最初に書き込む前に、各ファイルは、ファイルの最後にオフセット
  • 成功したライト・ファイルの後、実際に書き込まれたバイト数の増加を相殺しました。

lseek

オフセットファイルを開くために提供のlseek。

#include <sys/types.h>
#include <unistd.h>

//成功返回新的文件偏移量,失败返回-1
off_t lseek(int fd, off_t offset, int whence);

オフセットの解釈は、そこの値によって異なります。

  • そこからは== SEEK_SET、ファイルはファイルオフセットバイトの先頭からのオフセットに設定されている場合は、この時間オフセットは非負でなければなりません
  • そこでは== SEEK_CUR、現在の値として、ファイルオフセットがオフセット+次いで、このオフセット時間は、正または負のいずれであってもよい場合
  • そこには== SEEK_END、ファイルの長さ+オフセットをオフセットファイルに設定されている場合は、このオフセット時間は、正または負のいずれであってもよいです

注意:

  • lseekだけではシステムコールではありませんので、それは何も操作IO、IOが発生することはありませんが、カーネルにオフセット新しいファイルを記録したが、次の読み出し/書き込み動作のために使用されるオフセット
  • パイプ、FIFO、そしてソケットはオフセット設定ファイルをサポートしていない、あなたはのlseekを呼び出すことはできません

ioctl

ioctlは、デバイスと基礎となるサービスの記述子の動作および構成を制御するためのインタフェースを提供します。

#include <sys/ioctl.h>

//出错返回-1,成功返回其他值
int ioctl(int fd, int cmd, ...);
  • オブジェクト記述子上のioctlは、基準動作パラメータcmdで指定されたfd
  • 各デバイスドライバは、IOCTLコマンドの独自の専用セットを定義することができます

2.標準IO(IO緩衝)

アウトライン

実際には、標準的なIO IOインターフェイスstdio.hのヘッダファイルが提供されるが、特定のシステム内の特定の内部実装を有していてもよいです。
IOシステムコールなどだけでなく、標準的なIO 3つの定義済みファイルポインタSTDIN、STDOUT、stderrを、それぞれ標準入力、標準出力および標準誤差に相当します。

そして、洗浄バッファー

IO IO標準がバッファリングされ、バッファの3種類の合計:

  • 完全バッファ:バッファがいっぱいになった後、IO操作は、このようなディスク・ファイルとして、実行さ
  • ラインバッファ:のみIO操作用改行、そのようなコマンドライン端子(STDINおよびSTDOUT)として
  • バッファなし:バッファなし、IO操作は標準エラー出力として、すぐに実行しました

一般的には、システムのデフォルトのバッファの次の種類:

  • 標準エラー出力はバッファリングされていません
  • 緩衝フローラインを向け端末装置、そうでなければ完全にバッファリングされます

オープンストリームの場合、または変更はsetvbufバッファ型はsetbuf呼び出すことができます。

//成功返回0,失败返回非0
void setbuf(FILE *fp, char *buf);
int setvbuf(FILE *fp, char *buf, int mode, size_t size);
  • 閉鎖またはFPの開口のための緩衝機構はsetbuf、オープン時、BUFのBUFSIZのバッファの長さを指していなければならない、閉じ、BUFがNULLに設定されている場合
  • setvbuf正確には、バッファ型パラメータモードを設定します_IOLBF==全缓冲, _IOLBF==行缓冲,_IONBF==无缓冲
  • セットははsetvbufにバッファリングされる場合、BUFが自動的にバッファ長を割り当てるように、バッファサイズの長さにNULLに推奨BUFを指している必要があり、サイズはこの時点で0に設定することができます

バッファリングバッファフルラインについて、関係なく、IOの条件を満たしてするか否かの、fflushは機能がIO操作を強制するために使用することができ、我々はそれが紅潮呼び出します。

//成功返回0,失败返回EOF
//若fp为NULL,将导致冲洗所有输出流
int fflush(FILE *fp);

一般的な標準IO機能

一般的に使用される標準的なIO関数は、次のカテゴリに分けられます:

  • 開き、ストリームを閉じます
  • ポジショニング・ストリーム
  • テキストIO、IOバイナリ形式、およびIOの3種類を含む、ストリームを読みます

開き、ストリームを閉じます

//成功返回文件指针,失败返回NULL
FILE *fopen(const char *pathname, const char *type);

//成功返回0,失败返回EOF
void fclose(FILE *fp);

fopenのパス名で指定されたファイルを開く、タイプは読み書きモードを指定します。

  • その標準IOの一環として、文字型を使用してBには、テキストとバイナリファイルを区別することができます
  • Linuxカーネルは、テキストファイルとバイナリファイルを区別し、事実上のLinuxには影響を文字Bを使用し、読み取り専用、書き込み専用、読み書き、「R」、「W」、「RW」のように指定しません。
  • Windowsのテキストファイルは、読み取り専用、書き込み専用、読み書きが「R」、「W」、「RW」だった、バイナリファイルは、読み取り専用、書き込み専用、読み取りと書き込み「WB」、「RB +」、「RB」でした
  • 読み取り専用のアプローチは、ファイルが存在しない場合、存在する書き込み専用または読み書きしなければならないモードが作成されたファイルが必要です

バッファがフラッシュされる前に、出力データをクローズするfcloseは、ファイルを閉じて、出力データは破棄されます。

ポジショニング・ストリーム

同様の測位システムストリーム取得コールIO現在のファイルオフセット、ftellはとのfseekビットストリーム機能を使用することができます。

//成功返当前文件位置,出错返回-1
int ftell(FILE *fp);

//成功返回0,失败返回-1
void fseek(FILE *fp, long offset, int whence);

IOはのlseekにオフセットし、意味や価値そこから繰り返されることはありません同じシステムコールで設定することができますが、それは、Linux以外のシステムにある場合、1つの警告があります:

  • バイナリファイルの場合、ファイルの場所は、バイトオフセットに厳密に従って算出されるが、これは、テキストファイルではないかもしれません
  • テキストファイルを配置すると、そこからはSEEK_SETこと、およびオフセットしなければならない唯一の値が0またはftellはある返すことができます

テキストIO

2テキストIOがあります。

  • 文字を読み書きするたびに
  • すべては彼の文字列を読み書きします
/*
 * 每次读写一个字符
*/

//成功返回下一个字符,到达文件尾或失败返回EOF
int getc(FILE *fp);          //可能实现为宏,因此不允许将其地址作为参数传给另一个函数,因为宏没有地址
int fgetc(FILE *fp);         //一定是函数
int getchar();               //等价于getc(stdin)

//成功返回c,失败返回EOF
int putc(int c, FILE *fp);   //可能实现为宏,因此不允许将其地址作为参数传给另一个函数,因为宏没有地址
int fputc(int c, FILE *fp);  //一定是函数
int putchar(int c);          //等价于putc(c, stdout)
/*
 * 每次读写一行字符串
*/

//成功返回str,到达文件尾或失败返回EOF
char *fgets(char *str, int n, FILE *fp); //从fp读取直到换行符(换行符也读入),str必须以'\0'结尾,故包括换行符在内不能超过n-1个字符

//成功返回非负值,失败返回EOF
int fputs(const char *str, FILE *fp);    //将字符串str输出到fp,str只要求以'\0'结尾,不一定含有换行符

バイナリIO

バイナリIOは、関数freadとfwriteのです。

//返回读或写的对象数
size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp);
size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp);

バイナリIO一般的な用途は次のとおりです。

  • バイナリ配列を読み書き
  • 書き込み構造

2つの使用、また読んで、構造体の配列を書き込むことができます。

struct Item
{
    int id;
    char text[100];
};

int data[10];
struct Item item;
struct Item item[10];

//读写二进制数组
fread(&data[2], sizeof(int), 4, fp);
fwrite(&data[2], sizeof(int), 4, fp);

//读写结构
fread(&item, sizeof(item), 1, fp);
fwrite(&item, sizeof(item), 1, fp);

//读写结构数组
fread(&item, sizeof(item[0]), sizeof(item) / sizeof(item[0]), fp);
fwrite(&item, sizeof(item[0]), sizeof(item) / sizeof(item[0]), fp);

フォーマットIO

IO入力機能は、書式設定および出力機能の芳香族基を含み、我々は一般的な出力機能と入力機能2のみ3を残して、一般的なファイルポインタFP、API関連のファイルディスクリプタfdを除外していません。

//成功返回输出或存入buf的字符数(不含'\0'),失败返回负值
int printf(const char *format, ...);
int sprintf(char *buf, const char *format, ...);
int snprintf(char *buf, size_t n, const char *format, ...);
  • 文字列のはsprintfとsnprintfの端が自動的にBUFの終わり「\ 0」に追加されますが、文字は戻り値に含まれていません
  • snprintfのは、十分に大きなバッファbuf長Nを確保するために、発信者を必要とします
//成功返回输入的字符数,到达文件尾或失败返回EOF
int scanf(const char *format, ...);
int sscanf(const char *buf, const char *format, ...);

PS:迅速かつ簡単にメッセージの解析を行うように、様々なフィールドを抽出するsscanf関数を使用して、シリアルプロトコルに従って、メッセージのいずれかを受信するためにシリアルポート:実際のプロジェクトで実用的なヒントを有するSSCANF。

おすすめ

転載: www.linuxidc.com/Linux/2019-09/160746.htm