Linux文件描述符與FILE指針互相轉(zhuǎn)換
在Linux中,文件描述符(file descriptor, fd)和FILE指針(也稱為文件流指針,F(xiàn)ILE pointer)是兩種常見的文件操作接口。文件描述符是一個整數(shù),通過系統(tǒng)調(diào)用直接操作文件,而FILE指針是通過C標準庫函數(shù)操作文件。
文件描述符(fd):
由操作系統(tǒng)分配的一個整數(shù)標識符,用于標識打開的文件。
常用的系統(tǒng)調(diào)用包括open、read、write、close。
FILE 指針:
由C標準庫管理的文件流指針,通過fopen、fread、fwrite、fclose等庫函數(shù)操作。
1
文件描述符轉(zhuǎn)換為 FILE 指針
使用fdopen函數(shù)可以將一個已經(jīng)打開的文件描述符轉(zhuǎn)換為FILE指針。
函數(shù)原型如下所示:
FILE *fdopen(int fd, const char *mode);
參數(shù):
fd:文件描述符。
mode:打開模式,與fopen類似,如"r"、"w"、"a"等。
返回值:成功返回指向FILE對象的指針,失敗返回NULL。
示例如下:
#include <stdio.h>#include <unistd.h>#include <fcntl.h> int main() { // 打開一個文件并獲得文件描述符 int fd = open("example.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644); if (fd == -1) { perror("Failed to open file"); return 1; } // 將文件描述符轉(zhuǎn)換為 FILE 指針 FILE *file = fdopen(fd, "w"); if (file == NULL) { perror("Failed to convert fd to FILE*"); close(fd); return 1; } // 使用 FILE 指針進行寫操作 fprintf(file, "Hello, FILE pointer!n"); // 關閉 FILE 指針,注意這也會關閉文件描述符 fclose(file); return 0;}
2
FILE 指針轉(zhuǎn)換為文件描述符
使用fileno函數(shù)可以從一個FILE指針中獲取對應的文件描述符。
函數(shù)原型如下所示:
int fileno(FILE *stream);
參數(shù):
stream:指向FILE對象的指針。
返回值:返回文件描述符,如果出錯返回-1。
示例如下:
#include <stdio.h> int main() { // 打開一個文件并獲得 FILE 指針 FILE *file = fopen("example.txt", "w"); if (file == NULL) { perror("Failed to open file"); return 1; } // 從 FILE 指針中獲取文件描述符 int fd = fileno(file); if (fd == -1) { perror("Failed to convert FILE* to fd"); fclose(file); return 1; } // 使用文件描述符進行寫操作 const char *text = "Hello, file descriptor!n"; if (write(fd, text, strlen(text)) == -1) { perror("Failed to write to file"); } // 關閉 FILE 指針,這也會關閉文件描述符 fclose(file); return 0;}
注意事項
文件描述符和 FILE 指針的關聯(lián):
fdopen函數(shù)返回的FILE指針和原始文件描述符是關聯(lián)的。
對FILE指針的操作會影響文件描述符,反之亦然。
關閉文件:
使用fclose關閉FILE指針時,底層文件描述符也會被關閉。
因此,不要在關閉FILE指針后再次使用該文件描述符。
緩沖問題:
FILE指針使用標準庫緩沖機制,文件描述符直接操作文件。
混合使用這兩者時需要注意緩沖區(qū)的刷新問題,以避免數(shù)據(jù)不一致。
通過上述示例和說明,可以在Linux程序中靈活地在文件描述符和FILE指針之間轉(zhuǎn)換,根據(jù)需要選擇合適的接口進行文件操作。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。