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

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

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

2024-09-05 23:04:35
字體:
供稿:網(wǎng)友

本文研究的主要是Linux中l(wèi)inux/202671.html">linux/202188.html">linux/139146.html">linux/241917.html">文件描述符fd與文件指針FILE*互相轉(zhuǎn)換的相關(guān)內(nèi)容,具體介紹如下。

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

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

FILE *指針變量標識符;

其中FILE應為大寫,它實際上是由系統(tǒng)定義的一個結(jié)構(gòu),該結(jié)構(gòu)中含有文件名、文件狀態(tài)和文件當前位置等信息。在編寫源程序時不必關(guān)心FILE結(jié)構(gòu)的細節(jié)。

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

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

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

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

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

PS:為了節(jié)省篇幅,還是繼續(xù)忽略返回值的檢查。

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

#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,因此并未創(chuàng)建新的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進行關(guān)聯(lián),因此也是未創(chuàng)建新的fd。值得注意的是,F(xiàn)ILE指針的模式(mode)必須與文件描述符的模式兼容。

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

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

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

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

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

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

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

#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種設(shè)置(r/r+/w/w+/a/a+)均返回非空指針。

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

繼續(xù)嘗試"r"/"r+"/"a"/"a+"的設(shè)置,可以發(fā)現(xiàn)所謂“兼容”只與讀寫權(quán)限有關(guān),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.

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

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

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

將fdopen用于共享內(nèi)存對象的結(jié)果是未定義的。

總結(jié)

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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
欧美日韩 国产精品| 欧美成人视屏| 国产999精品久久| 午夜欧美大尺度福利影院在线看| 玖玖在线视频| 在线电影一区二区三区| 99久久久久国产精品| 最新日韩av在线| 国产精品自拍网| 在线一区二区日韩| 国产精品 欧美激情| av网站大全免费| 福利视频一区二区| 久久99国产成人小视频| 2022国产麻豆剧果冻传媒剧情| 国产乱了高清露脸对白| 国产综合激情| 免费看的www视频网站视频| 黑人久久a级毛片免费观看| 一本一本久久a久久精品牛牛影视| wwww亚洲| 理论片日本一区| 国产精品jvid在线观看蜜臀| 亚洲精品午夜av福利久久蜜桃| 国产在线播放av| 久久久精品日本| 亚洲综合av网| 懂色av中文在线| 日韩中文视频免费在线观看| 国产成人精品综合久久久| 黄色欧美网站| 僵尸世界大战2 在线播放| 成人一级生活片| 91video| 少妇精品无码一区二区| 天天色棕合合合合合合合| 欧美伦理片在线观看| 一色屋成人免费精品网| 亚洲激情小视频| 黄色欧美成人| 国产午夜精品一区二区三区四区| 麻豆精品一区二区三区视频| 在线国产中文字幕| 色婷婷av一区二区| 亚洲欧洲精品天堂一级| 久久国产精品久久久| 噜噜噜狠狠夜夜躁精品仙踪林| 国产精品美女久久久久av福利| 91极品视频在线观看| 日本一极黄色片| 免费在线观看黄网站| 国产精品密蕾丝视频下载| 精品裸体bbb| 久久精品www| 亚洲成av人电影| 午夜亚洲福利老司机| 999久久久免费精品国产牛牛| 日韩欧美在线视频一区二区| 国产精品久久影视| 蜜臀国产一区二区三区在线播放| 欧美日韩午夜激情| 免费成年网站| 久久精品国产亚洲7777| 欧美国产日本高清在线| 91美女视频| 国产导航在线| 日韩在线视频线视频免费网站| 性中国xxx极品hd| 国产精品一区二区性色av| 亚洲精品国产综合区久久久久久久| 97在线免费观看| 亚洲色图在线视频| 精品视频一区二区三区| 91精品一区二区三区综合在线爱| y97精品国产97久久久久久| 少妇高清精品毛片在线视频| 精品国产一区av| 欧美日韩成人一区二区三区| 亚洲欧美在线视频| 91成人网在线观看| 亚洲网中文字幕| www.夜夜爱| 你懂的网站在线观看| 日本黄色激情视频| 天天射夜夜骑| 中文字幕天天干| 蜜臀久久久久久999| 欧州一区二区| 日本视频在线一区| 国产精品久久久久无码av| 国产精品宾馆在线精品酒店| 久久美女福利视频| 日本丰满www色| 欧美老女人另类| 国产成人自拍网| 综合日韩在线| 中文字幕在线视频播放| 嫩草av久久伊人妇女超级a| 在线播放av片| 一个人看的www视频免费观看| 538在线一区二区精品国产| 日韩理论片在线观看| 免费看黄色aaaaaa 片| 国产精品视频一区二区免费不卡| 色资源二区在线视频| 360天大佬第二季在线观看| 好吊妞视频一区二区三区| 日韩黄色在线观看| 欧美一级精品在线| 亚洲另类中文字| 杨钰莹一级淫片aaaaaa播放| 国产精品免费入口| 国内精品久久久久影院色| 偷偷色噜狠狠狠狠的777米奇| 91极品女神私人尤物在线播放| 九七影院97影院理论片久久| 欧美激情精品久久| 日本不卡在线视频| 性欧美大战久久久久久久久| 日韩一区二区高清| 在线播放你懂得| 蜜桃成人精品| 久久99精品久久久久久久久久久久| 欧美精品日韩在线| 亚洲黄色在线观看| 日韩理论电影院| 视频三区二区一区| 欧美久久久久| 国产一区二区三区免费| 亚洲大片在线观看| www.男人天堂.com| 国产永久精品大片wwwapp| 久久综合伊人77777| 成年人视频网站免费| 国产人妻精品一区二区三区不卡| 国产一级激情| 一区二区视频网| 日本一卡2卡三卡4卡网站| 91九色视频蝌蚪| 婷婷丁香花五月天| 亚洲国产精品天堂| 黑人巨大亚洲一区二区久| 中文字字幕码一二三区| 欧美性受xxxx黑人xxxx| 国产成人天天5g影院| 一级毛片免费看| 最近最好的中文字幕2019免费| 一本色道久久综合狠狠躁的推荐| 色综合天天狠天天透天天伊人| 中文字幕+乱码+中文| 日本一区二区三区免费乱视频| 九九爱在线视频观看免费视频| h动漫在线视频| 国产在线黄色| 秋霞成人午夜伦在线观看| 亚洲成a人片在线观看中文| 精品日产一区2区三区黄免费| 姬川优奈aav一区二区| 亚洲的天堂在线中文字幕| 性做久久久久久免费观看欧美| 精品无码久久久久久国产| 日韩欧美在线免费观看视频| 亚洲av无码国产精品久久| 国产在线999| 欧美日韩一区高清| 欧美精品18| 成人免费淫片免费观看| 国产成人精品白浆久久69| 一区二区三区四区不卡| 高h调教冰块play男男双性文| 欧美大片免费播放| 成年永久一区二区三区免费视频| 亚洲精品免费在线播放| 日韩欧美高清一区| caoporn超碰97| 不卡的av一区| 桃乃木かなav在线播放| 美腿丝袜亚洲三区| 日韩美女av在线| 冲田杏梨av在线| 蜜臀av免费观看| 国内伊人久久久久久网站视频| 666精品在线| 九九热精品视频在线播放| 羞羞答答国产精品www一本| 欧美成人aaaaⅴ片在线看| 日韩性小视频| 国产原创一区二区三区| 日韩av电影免费观看高清| 在线观看亚洲欧美| 激情六月丁香婷婷| 久久精品亚洲精品国产欧美| 热re91久久精品国99热蜜臀| 亚洲黄页网站| h1515四虎成人| 视频一区在线视频| 欧美性视频精品| 北岛玲一区二区三区| 欧美亚视频在线中文字幕免费| 国产精品久久成人免费观看| 成人亚洲一区| 亚洲乱码精品一二三四区日韩在线| 国内精品在线观看视频| 美女久久久久| 精品国产在天天线2019| а_天堂中文在线| 狠狠色伊人亚洲综合成人| 伊人久久亚洲美女图片| 国产午夜亚洲精品不卡| 日韩中文欧美在线| 色综合一本到久久亚洲91| 国产精品wwwwww| 国产精品系列在线观看| 久久久久无码精品国产sm果冻| 国产极品久久久| 91麻豆国产语对白在线观看| 成人全视频免费观看在线看| 国产精品久久久久久av下载红粉| 97国产精品视频| 欧美videos极品另类| 亚洲av熟女国产一区二区性色| 欧美电影免费观看| 欧美成人综合色| 色综合天天综合网国产成人综合天| 日韩伦理一区| 国产精品盗摄久久久| 香蕉久久一区二区三区| 中文字幕一区二区三区欧美日韩| 亚洲无码精品国产| 亚洲电影在线看| 香蕉久久aⅴ一区二区三区| 成人在线一区二区三区| 99re在线视频精品| 亚洲经典三级| 中文字幕亚洲综合久久筱田步美| 99精品在线观看| 精品不卡一区二区| 欧美精品三级日韩久久| 五月天黄色网址| 69亚洲乱人伦| 欧美激情视频网址| 久久综合九九| 一区二区www| 美脚丝袜一区二区三区在线观看| 欧美大学生性色视频| 亚洲免费福利| 国产精品成人网站| 天天操夜夜操av| 国产精品99免视看9| 中文字幕一区二区三区人妻| 欧美成人精品一级| 四虎wwwcom| 羞羞的视频网站| 午夜av在线免费观看| 国产脚交av在线一区二区| 成人午夜短视频| 香蕉久久夜色精品国产| 少妇精品视频一区二区| 黑人巨大精品| 国产午夜精品久久久久久久| 一级全黄少妇性色生活片| 依依成人精品视频| 日日操免费视频| 欧美日韩在线大尺度| 欧美日韩国产片| 青青草免费观看免费视频在线| 最新成人av网站| 99久久久国产精品无码免费| 国产无套粉嫩白浆内谢的出处| 中文字幕在线亚洲三区| 亚洲不卡在线播放| 国产精品www爽爽爽| 欧美一区二区不卡视频| 亚洲3atv精品一区二区三区| 男女猛烈无遮挡| 中文天堂在线播放| 在线视频国产一区| 日韩一区二区在线免费观看| 成人久久18免费网站图片| 一区二区三区在线视频观看58| 成人免费视频播放| 亚洲精品日韩av| 精品国产一区二区三区久久久樱花| 欧美性狂猛xxxxxbbbbb| 最新日韩精品| 精品中文字幕一区二区三区| 夜夜骑日日射| 石原莉奈一区二区三区高清在线| 欧美在线亚洲综合一区| 国产成人免费看| 3d精品h动漫啪啪一区二区| 99久久久精品免费观看国产| 久久久久成人网站| 国产国语刺激对白av不卡| 日韩av二区| 亚洲新声在线观看| 在线观看国产精品入口男同| 亚洲欧洲成人在线| 国产自产2019最新不卡| 中文字幕在线不卡一区| 一道本在线视频| 毛片毛片毛片毛片| 在线国产1区| 韩国主播福利视频一区二区三区| 68精品久久久久久欧美| www国产精品内射老熟女| 香蕉国产在线| 韩国久久久久久| 久久伊人蜜桃av一区二区| 国产18精品乱码免费看| 国产女优裸体网站| www..com.cn蕾丝视频在线观看免费版| av不卡免费在线观看| 国产美女扒开尿口久久久| 艳母动漫在线免费观看| 亚洲男同1069视频| 欧美日韩国产免费| 精品成人av一区| 欧美性生活大片免费观看网址| 激情欧美成人久久综合小说| 久久久91精品国产一区不卡| 五月六月丁香婷婷| 亚洲欧美激情一区二区三区| 波多野结衣久草一区| 欧美最猛性xxxxx免费| eeuss在线观看| 久久国产精品免费一区二区三区| 亚洲va在线观看|