亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Linux服務器 > 正文

Linux中文件描述符fd與文件指針FILE*互相轉換實例解析

2024-09-05 23:04:35
字體:
來源:轉載
供稿:網友

本文研究的主要是Linux中linux/202671.html">linux/202188.html">linux/139146.html">linux/241917.html">文件描述符fd與文件指針FILE*互相轉換的相關內容,具體介紹如下。

1.文件描述符fd的定義:文件描述符在形式上是一個非負整數。實際上,它是一個索引值,指向內核為每一個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者創建一個新文件時,內核向進程返回一個文件描述符。在程序設計中,一些涉及底層的程序編寫往往會圍繞著文件描述符展開。但是文件描述符這一概念往往只適用于UNIX、Linux這樣的操作系統。

2.文件指針FILE定義說明文件指針的一般形式為:

FILE *指針變量標識符;

其中FILE應為大寫,它實際上是由系統定義的一個結構,該結構中含有文件名、文件狀態和文件當前位置等信息。在編寫源程序時不必關心FILE結構的細節。

使用系統調用的時候用文件描述符的時候比較多,但是操作比較原始。C庫函數在I/O上提供了一些方便的包裝(比如格式化I/O、重定向),但是對細節的控制不夠。

如果過度依賴其中的一種只會徒增麻煩,所以知道兩者的轉換是很有必要的。FILE*是對fd的封裝

當然,有人會說知道文件路徑的話重新打開就是了,但是這會產生競爭條件(Race Conditions),首先重新打開文件,相當于是2個fd指向同一文件,然后如果在打開的期間文件被刪除了又被新建了一個同名文件,2個fd指向的便是不同的文件。

glibc庫提供了兩個轉換函數fdopen(3)和fileno(3),都是<stdio.h>中的

FILE *fdopen(int fd, const char *mode);
int fileno(FILE *stream);

PS:為了節省篇幅,還是繼續忽略返回值的檢查。

來看看測試吧,是不是我們想的那樣。

#include <stdio.h>#include <unistd.h>#include <fcntl.h>int main(){  const char* filename = "new.txt";  int fd = open(filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);  FILE* fp = fdopen(fd, "w+");  int fd2 = fileno(fp);  printf("fd=%d | fd2=%d/n", fd, fd2);  fclose(fp);  close(fd);  return 0;}
$ gcc test.c $ ./a.out fd=3 | fd2=3

參考fileno手冊:

The function fileno() examines the argument stream and returns its integer descriptor.

FILE是對fd的封裝,fileno()是直接取得被封裝的fd,因此并未創建新的fd指向該文件。

參考fdopen手冊:

The fdopen() function associates a stream with the existing file descriptor, fd. The mode of
the stream (one of the values "r", "r+", "w", "w+", "a", "a+") must be compatible with the
mode of the file descriptor.

fdopen()是講流(FILE對象)與已存在的文件描述符fd進行關聯,因此也是未創建新的fd。值得注意的是,FILE指針的模式(mode)必須與文件描述符的模式兼容。

關于mode參數先擱置會兒,目前我們知道的是,使用fileno和fdopen進行轉換,都是在原有的fd上進行操作,并未產生新的fd。那么,再次審視剛才的代碼,是否發現了問題?

我們來檢查下close(fd)的返回值,把close(fd)改成下列代碼

  if (-1 == close(fd)) {    perror("close");    exit(1);  }
$ gcc test.c $ ./a.out close: Bad file descriptor

沒錯,fclose在關閉文件指針的時候,內部其實也關閉了文件描述符(否則資源就泄露了),既然這里fp內部的文件描述符和fd是同一個,當fp被關閉時,fd也被關閉了,再次關閉fd就會出現“損壞的文件描述符”錯誤。

OK,現在回顧下fopen的第2個參數,又r/r+/w/w+/a/a+一共6種設置(windows平臺的rb/rb+/wb/wb+暫且不談),對比Linux手冊我將對應的open設置列出來

linux,文件描述符,文件指針,文件描述符fd,fd,指針,文件描述符限制

依然是進行測試,修改fd_mode和fp_mode,看看實驗結果

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>const int security = S_IRUSR | S_IWUSR;const int fd_mode = O_RDWR | O_CREAT | O_TRUNC;const char* fp_mode = "r";int main(){  int fd = open("new.txt", fd_mode, security);  FILE* fp = fdopen(fd, fp_mode);  if (fp == NULL) {    perror("fdopen");    exit(1);  }  close(fd);  return 0;}

在fd_mode等價于"w+"時,fp_mode的6種設置(r/r+/w/w+/a/a+)均返回非空指針。

在fd_mode等價于"w"時,fp_mode6種設置只有"a"和"w"返回非空指針。

繼續嘗試"r"/"r+"/"a"/"a+"的設置,可以發現所謂“兼容”只與讀寫權限有關,O_RDWR兼容O_RDONLY和O_WRONLY,而后兩者則只與自身兼容。

有意思的是O_APPEND(在末尾添加)和O_TRUNC(截斷文件從頭添加)也兼容。

The file position indicator of the new stream is set to that
belonging to fd, and the error and end-of-file indicators are cleared. Modes "w" or "w+" do
not cause truncation of the file. The file descriptor is not dup'ed, and will be closed when
the stream created by fdopen() is closed.

繼續查看fdopen的手冊內容,可以看到"w"和"w+"在這里不會導致文件截斷。

后一句也印證了我們前面的實驗結果:文件描述符不會被復制,文件指針被關閉時文件描述符也會被關閉。

PS:其實fdopen的手冊上還有最后一句:The result of applying fdopen() to a shared memory object is undefined.

將fdopen用于共享內存對象的結果是未定義的。

總結

以上就是本文關于Linux中文件描述符fd與文件指針FILE*互相轉換實例解析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人有码在线视频| 国产成人一区二区三区小说| 亚洲乱码一区二区| 欧美大片网站在线观看| 丝袜亚洲另类欧美重口| 国内精品久久久久影院 日本资源| 久久久久久久久国产| 精品亚洲一区二区三区在线观看| 亚洲国产成人在线播放| 欧美激情精品久久久| 国产精品成人久久久久| 91中文在线观看| 成人午夜在线视频一区| 不卡av电影院| 国产免费一区二区三区在线能观看| www国产亚洲精品久久网站| 国产欧美日韩丝袜精品一区| 日本一区二区不卡| 国产乱肥老妇国产一区二| 国产精自产拍久久久久久| 国产成人精品视频| 久久精品青青大伊人av| 久久久精品日本| 欧美一级淫片播放口| 精品久久久久久中文字幕大豆网| 日韩经典一区二区三区| 亚洲午夜国产成人av电影男同| 成人激情在线观看| 国产精品一区二区久久久| 日韩成人在线电影网| 91黄色8090| 色婷婷av一区二区三区在线观看| 亚洲精品日韩丝袜精品| 91九色蝌蚪国产| 超碰精品一区二区三区乱码| 国内精品视频久久| 亚洲国产成人爱av在线播放| 精品一区二区三区电影| 自拍偷拍亚洲精品| 日韩精品在线视频美女| 国产亚洲精品美女| 久久久久亚洲精品国产| 国产精品自拍偷拍视频| 国产精品96久久久久久| 91av视频在线播放| 国产亚洲欧美另类中文| 国产视频精品xxxx| 国产亚洲精品高潮| 在线视频欧美日韩精品| 在线播放日韩av| 国内精品久久久久影院 日本资源| 色yeye香蕉凹凸一区二区av| 日韩美女视频在线观看| 欧美激情国产日韩精品一区18| 色综合91久久精品中文字幕| 亚洲免费伊人电影在线观看av| 国产色综合天天综合网| 国产视频精品免费播放| 欧美韩国理论所午夜片917电影| 日韩精品极品在线观看播放免费视频| 国产原创欧美精品| 国产欧美亚洲精品| 亚洲精品一区在线观看香蕉| 欧美精品999| 欧美日韩国产综合视频在线观看中文| 国产精品视频资源| 欧美日韩国产一中文字不卡| 有码中文亚洲精品| 日韩亚洲欧美中文高清在线| 在线精品91av| 九九热视频这里只有精品| 日韩hd视频在线观看| 丝袜美腿亚洲一区二区| www国产精品视频| 欧美极品少妇xxxxⅹ喷水| 亚洲人av在线影院| 亚洲黄色成人网| 亚洲第一精品夜夜躁人人爽| 亚洲色图欧美制服丝袜另类第一页| 久久久日本电影| 欧美激情视频在线| 川上优av一区二区线观看| 日韩中文在线中文网三级| 91精品国产色综合久久不卡98| 欧美日韩国产中文字幕| 久久久久久高潮国产精品视| 成人欧美一区二区三区黑人孕妇| 日本sm极度另类视频| 欧美专区国产专区| 欧美一级电影久久| 日韩激情av在线免费观看| 亚洲欧美激情四射在线日| 久久视频在线直播| 精品国产一区二区三区久久久| 亚洲午夜激情免费视频| 欧美性少妇18aaaa视频| 亚洲午夜未满十八勿入免费观看全集| 日韩电影中文字幕一区| 亚洲的天堂在线中文字幕| 中文字幕日本精品| 国产91成人在在线播放| 国产精品久久久久免费a∨大胸| 久久久久久久久久久免费| 国产成人精品久久亚洲高清不卡| 中文字幕日韩在线播放| 国产美女久久久| 欧美精品制服第一页| 日韩在线观看免费高清| 国产精品女人久久久久久| 亚洲日韩中文字幕在线播放| 日韩视频一区在线| 国产专区欧美专区| 激情成人中文字幕| 欧美猛交ⅹxxx乱大交视频| 美女撒尿一区二区三区| 欧美在线免费视频| 夜夜狂射影院欧美极品| 伊人久久久久久久久久| 亚洲欧美一区二区激情| 亚洲精品视频免费在线观看| 91视频88av| 亚洲人成电影在线| 中文字幕不卡av| 国产成人在线视频| www.亚洲一二| 日韩成人黄色av| 亚洲香蕉成人av网站在线观看| 欧美日韩一二三四五区| 日韩欧美国产激情| 亚洲精品白浆高清久久久久久| 欧美成人精品在线观看| 77777少妇光屁股久久一区| 国产精品美女免费看| 欧美亚洲国产视频| 在线看国产精品| 久久综合久久88| 久久免费精品日本久久中文字幕| 人人澡人人澡人人看欧美| 久久国产精品久久久久| 久久91亚洲人成电影网站| xvideos亚洲人网站| 久久中国妇女中文字幕| 日本亚洲欧美三级| 久久999免费视频| **欧美日韩vr在线| 国产精品91在线| 中文日韩在线视频| 欧美激情成人在线视频| 欧美性xxxxx极品娇小| 国产精品久久久久av免费| 亚洲第一中文字幕在线观看| 在线视频欧美日韩| 日本韩国欧美精品大片卡二| 日韩欧美精品免费在线| 久久久噜噜噜久噜久久| 亚洲国产精彩中文乱码av在线播放| 38少妇精品导航| 亚洲激情在线视频| 亚洲欧洲一区二区三区在线观看| 亚洲成av人影院在线观看| 成人精品aaaa网站| 精品美女久久久久久免费| 国产精品中文久久久久久久| 亚洲天堂第二页|