Linux環境のプログラミングファイル記述子テーブル

前の記事で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;
}

 演算結果:

 

 

 

 

 

おすすめ

転載: blog.csdn.net/qq_44065088/article/details/108558875