Linux文件描述符(fd)的使用方法與注意事項

一、文件描述符概述

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-10 18:18
下一篇 2024-12-10 18:18

相關推薦

發表回復

登錄後才能評論