文件描述符
在 Linux 的世界裏,一切設備皆文件。我們可以系統調用中 I/O 的函數(I:input,輸入;O:output,輸出),對文件進行相應的操作( open()、close()、write() 、read() 等)。
打開現存文件或新建文件時,系統(內核)會返回一個文件描述符,文件描述符用來指定已打開的文件。這個文件描述符相當於這個已打開文件的標號,文件描述符是非負整數,是文件的標識,操作這個文件描述符相當於操作這個描述符所指定的文件。
程序運行起來後(每個進程)都有一張文件描述符的表,標準輸入、標準輸出、標準錯誤輸出設備文件被打開,對應的文件描述符 0、1、2 記錄在表中。程序運行起來後這三個文件描述符是默認打開的。
#define STDIN_FILENO 0 //標準輸入的文件描述符
#define STDOUT_FILENO 1 //標準輸出的文件描述符
#define STDERR_FILENO 2 //標準錯誤的文件描述符
在程序運行起來後打開其他文件時,系統會返回文件描述符表中最小可用的文件描述符,並將此文件描述符記錄在表中。Linux 中一個進程最多隻能打開 NR_OPEN_DEFAULT (即1024)個文件,故當文件不再使用時應及時調用 close() 函數關閉文件。
常用 I/0 函數
需要的頭文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int open(const char *pathname, int flags, mode_t mode);
功能:
打開文件,如果文件不存在則創建。
參數:
pathname: 文件的路徑及文件名。
flags: 打開文件的行爲標誌,如,以只讀方式(O_RDONLY,第一個爲字母不是數據)打開,以讀寫或新建新文件的方式(O_RDWR|O_CREAT)打開。
mode: 這個參數,只有在文件不存在時有效,指新建文件時指定文件的權限(文件權限詳情,請點此鏈接)。
返回值:
成功:成功返回打開的文件描述符
失敗:-1
int close(int fd);
功能:
關閉已打開的文件
參數:
fd: 文件描述符,open()的返回值
返回值:
成功:0
失敗:-1
ssize_t write(int fd, const void *addr, size_t count);
功能:
把指定數目的數據寫到文件(fd)
參數:
fd: 文件描述符
addr: 數據首地址
count: 寫入數據的長度(字節),一般情況下,數據有多少,就往文件裏寫多少,不能多也不能少
返回值:
成功:實際寫入數據的字節個數
失敗:-1
ssize_t read(int fd, void *addr, size_t count);
功能:
把指定數目的數據讀到內存(緩衝區)
參數:
fd: 文件描述符
addr: 內存首地址
count: 讀取的字節個數
返回值:
成功:實際讀取到的字節個數
失敗:-1