基本的なIOリダイレクト
基本IO
システムファイルIO
ファイルを操作するときのfopen、fwrite、およびその他のインターフェイスに加えて、システムインターフェイスを使用してファイルにアクセスすることもできます。
インターフェイスの紹介
開いた
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname: 要打开或创建的目标文件
flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
参数:
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开
这三个常量,必须指定一个且只能指定一个
O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
O_APPEND: 追加写
返回值:
成功:新打开的文件描述符
失败:-1
ここでは、パス名を含め、フラグが導入され、書き込み、読み取りなどがCライブラリのものと同様です。
ファイル記述子
定義するとき
int fd=open(.........)
この形式
で、ファイル記述子が0から始まる小さな整数であることがわかりました。ファイルを開くとき、オペレーティングシステムは、ターゲットファイルを記述するために、メモリ内に対応するデータ構造を作成する必要があります。したがって、ファイル構造があります。開いているファイルオブジェクトを表します。プロセスはopenシステムコールを実行するため、プロセスをファイルに関連付ける必要があります。各プロセスには、テーブルfiles_structを指すポインタファイルがあります。テーブルの最も重要な部分は、ポインタの配列を含むことです。各要素は、開いているファイルへのポインタです。したがって、本質的に、ファイル記述子は配列の添え字です。したがって、ファイル記述子を保持している限り、対応するファイルを見つけることができます*
したがって、C言語で使用されるfpの最下層は構造体です。構造体には、fdを記述子として記述するデータが含まれている必要があります。
0&1&2
デフォルトでは、Linuxプロセスには、標準入力0、標準出力1、および標準エラー2
の3つのデフォルトのオープンファイル記述子があります。0、1、2に対応する物理デバイスは、通常、キーボード、ディスプレイ、ディスプレイです。
リダイレクト
fd配布ルール
コードが標準出力になる前にclose(1)// 1を閉じてから、
データをfdに書き込むと、表示は表示されませんが、ファイルに書き込まれます。それ以降、配布ルールを導入することができます。
1.システムは、012を標準入力、標準出力、および標準エラーに割り当てます。(最下層はハードウェアと相互作用する必要があるため)
2。事前にそれらの1つを閉じると、fdが割り当てに小さな添え字を選択することがわかります。
3.これはリダイレクトも導入します。
この図はリダイレクトの本質です。
コードに目を通す
int main()
{
close(1);
int fd = open("myfile", O_WRONLY|O_CREAT, 00644);
if(fd < 0){
perror("open");
return 1;
}
printf("fd: %d\n", fd);
fflush(stdout);
close(fd);
exit(0);
}
最初に閉じる(1)、次に1が最小の添え字です。ファイルを開くと、ファイル記述子fdで記述されます。このとき、fdの値は1であり、ディスプレイへの入力はファイルにリダイレクトされます。
dup2関数
ヘッダーファイルとその定義:#include <unistd.h> int dup2(int oldfd、int newfd);
dup2は、パラメーターnewfdを使用して、新しいファイル記述子の値を指定できます。プログラムがパラメータnewfdを使用している場合、システムはnewfdが指すファイルを閉じます。newfdがoldfdと等しい場合、newfdが指すファイルを閉じずにnewfdに戻ります。dup2によってコピーされたファイル記述子は、元のファイル記述とさまざまなファイル状態を共有します。すべてのロック、読み取りと書き込みの位置、さまざまなアクセス許可またはフラグなどを共有します。
戻り値:
dup2呼び出しが成功すると、新しいファイル記述子が返され、失敗すると-1が返されます。