一、文件描述符概述
文件描述符是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