前の記事でPCBを紹介しましたが、ファイル記述子テーブルについて説明しましたが、どのように見えますか?
理解するためにビデオを見てみましょう
1.口頭紹介
実際、私たちが通常目にするint fdは、実際のファイル記述子ではなく、コード名として理解できます。おそらく、このint fdを長時間呼び出した後に、ファイル記述子と呼びます。このfdと実際のファイル記述子には1対1のマッピング関係があります。上の図に示すように、
fileno関数はFILE *をfdに変換
します。元のFILE *は閉じられていませんが、int fdに逆にマッピングされてい ます。ClosefdはFILE *と同じですFclose、ただしfclose FILE *。このfdを操作に使用すると、BADFDになります(実際のファイル記述子が閉じられているため)。
2.最初に、結論を確認するためのコードを見てみましょう
#include <iostream>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
using namespace std;
#define FILE_NAME "tmp.txt"
#define BUF_SIZE 4096
int32_t main(int32_t argc, const char* argv[])
{
FILE* filein;
if(!(filein = fopen(FILE_NAME, "rw"))){
fprintf(stderr, "the file open error ! the reason is :%s \n", strerror(errno));
exit(-1);
}
char buf[BUF_SIZE];
fgets(buf, sizeof(buf), filein);
cout << "the infomation is :" << buf << endl;
// 注意接下来的操作
int fd = fileno(filein);
fclose(filein);
int size;
size = write(fd, "嘤嘤嘤", 8);
if(size < 0){
fprintf(stderr, "the file open error ! the reason is :%s \n", strerror(errno));
exit(-2);
}
return 0;
}
演算結果: