关于fd和fp(fd:file descirptor fp:file pointor)
生活随笔
收集整理的這篇文章主要介紹了
关于fd和fp(fd:file descirptor fp:file pointor)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
通常,我們在輸入數據或輸出數據的設備為鍵盤或者顯示器。當然,我們比較熟悉的輸入輸出,可能就是對于文件的操作,還有直接從終端輸出,顯示到顯示器上。在C語言中,我們使用fopen,fclose,fread,fwrite對文件進行相應的操作。由于操作系統內核的不同,在linux系統下,我們不僅僅可以使用C庫里邊的那些函數,還使用open,close,read,write對文件進行相應的操作,這些都是系統調用的函數。它們之間有聯系也有區別,現在我們分析一下吧。
C庫:
(1)FILE *fopen(const char *path, const char *mode);
(2)int fclose(FILE *fp);
(3)size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
(4)size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
系統調用:
(1)
#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); //flags表示打開的方式,主要有O_RDONLY,O_WRONLY,O_CREAT,O_EXCL等 int creat(const char *pathname, mode_t mode); //如果打開不成功的話,就自己創建一個我們看出,使用open函數的時候,調用的是系統的函數,而上述fopen是使用C庫里邊的函數。還有一點是open的返回值是整形,這也是與fopen不一樣的。我們使用fopen的時候,它是返回一個file*,在這里,open的返回值是整形,它代表文件描述符。即唯一標識打開文件的信息。文件描述符是什么呢。我們之前在task_struct中介紹過PCB的基本信息。簡單了解了PCB結構體中的信息后,我們發現在task_struct結構體中有一個files_struct結構體就是用于存放打開文件的一系列信息。
struct files_struct {/** read mostly part*/atomic_t count; //自動增量 bool resize_in_progress;wait_queue_head_t resize_wait;struct fdtable __rcu *fdt; struct fdtable fdtab; //文件描述符表/** written part on a separate cache line in SMP*/spinlock_t file_lock ____cacheline_aligned_in_smp;unsigned int next_fd; //下一個文件描述符unsigned long close_on_exec_init[1]; //執行exec時 需要關閉的文件描述符初值集合 unsigned long open_fds_init[1]; //當前打開文件 的文件描述符屏蔽字 unsigned long full_fds_bits_init[1];struct file __rcu * fd_array[NR_OPEN_DEFAULT]; //指向文件描述符組的指針 }; FILE的結構 struct _iobuf {char *_ptr; //緩沖區當前指針int _cnt;char *_base; //緩沖區基址int _flag; //文件讀寫模式int _file; //文件描述符int _charbuf; //緩沖區剩余自己個數int _bufsiz; //緩沖區大小char *_tmpfname;}; typedef struct _iobuf FILE;可以看到,files_struct中有一個文件描述符表,用來存放文件描述符。我們對于程序啟動時默認會打開三個文件:stdin,stdout,stderr,它們的文件描述符分別表示:0,1,2。頭文件unistd.h中有如下宏:
#define STDIN_FILENO 0 #define STDOUT_FILENO 1 #define STDERR_FILENO 2總結一下:
每個進程在linux內核中都有一個描述進程信息的結構體,稱為task_struct。而描述進程的信息稱為PCB,每個進程都有自己的PCB(進程控制塊)。在task_struct結構體中,有一個指向files_struct的結構體指針,files_struct結構體中,描述了相應的文件描述符,I/O緩沖區,下一個文件描述符等。
說起庫函數和系統調用,我們知道,最底層是硬件->驅動程序->操作系統->系統調用->shell外殼程序->庫函數->用戶程序;所以可以知道,庫函數是在系統調用的基礎上形成的,因此也知道open與fopen的關系了吧,fopen的底層也是調用了open的。
同理,看一下另外的read,write,close
ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); int close(int fd);使用這些函數的時候,參數傳入文件描述符來確定是哪個文件。
總結
以上是生活随笔為你收集整理的关于fd和fp(fd:file descirptor fp:file pointor)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020年跨年晚会节目单
- 下一篇: [linux]wait详解