一、文件描述符概述
文件描述符是Linux系統中對打開文件的引用,每個進程都有自己的文件描述符表。在進程中打開文件時,會返回一個整型的文件描述符,用來標識該文件。文件描述符的值從0開始,每打開一個文件,描述符的值就會遞增。在C語言中,文件描述符用int類型來表示。
在Linux中,文件描述符不僅僅可以表示已經打開的普通文件,還可以用於表示管道操作,套接字、目錄和設備等。
二、文件描述符的使用方法
1、打開文件
在Linux中,打開文件的函數為open(),示例代碼如下:
#include <fcntl.h>
#include <errno.h>
int fd = open("file.txt", O_RDONLY);
if(fd == -1) {
perror("open file.txt error:");
exit(EXIT_FAILURE);
}
上述代碼中,指定的文件名為file.txt,文件的打開方式為只讀模式,函數返回的是文件描述符,如果返回值等於-1,表示打開文件失敗。
2、讀寫文件
在Linux中,讀取和寫入文件的函數分別為read()和write(),示例代碼如下:
讀取文件示例:
#include <unistd.h>
#include <errno.h>
char buffer[1024];
int ret;
ret = read(fd, buffer, sizeof(buffer));
if(ret == -1) {
perror("read error:");
exit(EXIT_FAILURE);
}
寫入文件示例:
#include <unistd.h>
#include <errno.h>
char buffer[1024] = "Hello World!";
int ret;
ret = write(fd, buffer, sizeof(buffer));
if(ret == -1) {
perror("write error:");
exit(EXIT_FAILURE);
}
3、關閉文件
在完成對文件的操作後,需要關閉文件,釋放資源。關閉文件的函數為close(),示例代碼如下:
#include <unistd.h> close(fd);
三、文件描述符的注意事項
1、資源限制
系統資源有限,每個進程可以打開的文件數是有限制的。默認情況下,每個進程可以打開的文件數為1024個,可以通過ulimit命令查看。
當進程打開的文件數達到系統限制時,會導致無法打開新的文件,可以通過增加系統限制或者調整進程的邏輯來解決。
2、文件描述符的複製
Linux中的文件描述符是引用文件的方式,可以利用dup() or dup2()函數將一個文件描述符複製到另一個文件描述符,以便將一個已經打開的文件描述符傳遞給一個函數。
例如:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int fd1 = open("file1.txt", O_RDONLY);
int fd2 = dup(fd1);
上述代碼中,fd2是通過將fd1複製而來的文件描述符,它們引用同一個文件。
3、文件描述符的關閉
在使用文件描述符時,要注意及時關閉文件,否則會浪費系統資源,造成不必要的麻煩。當一個進程以當前用戶許可權打開一個文件後,該文件的所有權就屬於了該進程,而不是當前用戶。
如果在打開文件後,刪除了該文件,但進程還沒關閉該文件,則該文件仍然可以繼續訪問和修改,因為該文件的所有權已經屬於了進程,不受文件刪除的影響。
4、文件描述符的作用域
文件描述符的作用域默認情況下只在進程內有效,而無法在進程之間進行傳遞。如果需要在進程之間傳遞文件描述符,則可以使用Unix域套接字。
例如:
int socketpair(int domain, int type, int protocol, int sv[2]);
/*創建兩個進程之間的管道*/
int fd[2];
socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
pid_t pid;
pid = fork();
if (pid < 0) {
perror("fork error:");
return -1;
} else if (pid == 0) {
/* 子進程向父進程發送信息 */
char *buffer = "Hello World";
write(fd[1], buffer, strlen(buffer));
close(fd[1]);
} else {
/* 父進程接收子進程發送的信息 */
char buffer[1024];
memset(buffer, 0, 1024);
read(fd[0], buffer, 1024);
printf("Message from child process: %s\n", buffer);
close(fd[0]);
}
總結
文件描述符是Linux系統中對打開文件的引用,每個進程都有自己的文件描述符表。在使用文件描述符時,要注意及時關閉文件,否則會浪費系統資源。
文件描述符的作用域默認情況下只在進程內有效,如果需要在進程之間傳遞文件描述符,則可以使用Unix域套接字。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/230679.html
微信掃一掃
支付寶掃一掃