Linux系統呼叫 檔案程式設計

2021-07-23 21:58:09 字數 4204 閱讀 2264

檔案描述符:在linux系統中,開啟的檔案會對應乙個數字(非負整數),這個由系統分配的數字我們

稱之為檔案描述符(file descriptor),具體可以看下這裡的:linux中的檔案描述符與開啟檔案之間的關係 。

學習目標:

1、學習系統呼叫的函式:open,close,read,write,creat,lseek,dup;

2、程式設計:複製檔案的程式。

一、學習函式

1、open:開啟或者建立乙個檔案或裝置(open and possibly create a file or device)

1)函式原型

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

2)所屬標頭檔案

#include

#include

#include

3)返回值

成功: 返回新的檔案描述符

失敗: -1

4)引數說明

*pathname: 包含路徑的檔名(可以是絕對路徑也可以是相對路徑)

*flags: 檔案開啟的標誌

使用o_rdonly(唯讀), o_wronly(只寫) 或 o_rdwr(可讀可寫) 與 o_creat(建立新檔案)

*o_creat: 若檔案不存在則新建乙個檔案

若使用了o_creat則需要指定mode(檔案許可權), 但是mode通常會被umask(掩碼)修改, 所以

一般建立的檔案許可權為(mode & ~umask),

2、close: 關閉乙個檔案描述符

1)函式原型

int close(int fd);

2)所屬標頭檔案

#include

3)返回值

成功: 0

失敗: -1

4)引數說明

fd: 帶關閉的檔案描述符

3、read: 在檔案描述符上執行讀操作(read from a file descriptor)

1)函式原型

ssize_t read(int fd, void *buf, size_t count);

2)所屬標頭檔案

#include

3)返回值

成功: 返回成功讀取的位元組數

失敗: -1

4)引數說明

fd: 待讀取的檔案描述符

buf: 讀取資訊的緩衝陣列

count: 讀取位元組數

4、write: 在檔案描述符上執行寫操作(write to a file descriptor)

1)函式原型

ssize_t write(int fd, const void *buf, size_t count);
2)所屬標頭檔案

#include

3)返回值

成功: 返回成功寫入的位元組數

失敗: -1

4)引數說明

fd: 待寫入資料的檔案描述符

buf: 待寫入的資料緩衝陣列

count: 待寫入資料的位元組數

5、creat: 建立乙個檔案, 並以只寫的方式開啟該檔案

1)函式原型

int creat(const char *pathanme, mode_t mode);

2)所屬標頭檔案

#include

#include

#include

3)返回值 

成功: 返回新建的檔案描述符

失敗: -1

4)引數說明

pathname: 建立的檔名(包含路徑)

mode: 設定檔案許可權

6、lseek: 重新定義檔案讀寫的偏移量

1)函式原型

off_t lseek(int fd, off_t offset, int whence);\

2)所屬標頭檔案

#include

#include

3)返回值

成功: 返回產生的偏移量(距離檔案頭的位置)

失敗: -1

4)引數說明

fd: 要重置的檔案描述符

offset: 要便宜的量

whence: 偏移開始的位置

* seek_set:    從檔案頭

* seek_cur:  從當前位置

* seek_end:  從檔案尾

7、dup: 複製乙個檔案描述符(duplicate a file descriptor)

1)函式原型

int dup(int old fd);
int dup(int old, int newfd);

2)所屬標頭檔案

#include

3)返回值

成功: 返回新的檔案描述符

失敗: -1

4)引數說明

oldfd: 原始檔描述符

newfd: 目標檔案描述符

二、最佳實踐

* 編寫copy程式:

#include #include #include #include #include #define buf_size 512

void main(int argc, char* argv)

/* 4. 關閉目標檔案 */

close(fd_dest);

/* 5. 關閉原始檔 */

# 這裡採用命令列引數

argc: 引數個數

argv[0]: 程式名

argv[1]: 第乙個引數,  以此類推第二個第三個,,,,,

/* 2. 開啟目標檔案 */

fd_dest = open(argv[2], o_wronly|o_creat, s_irwxu|s_irwxg|s_irwxo);

這裡可以看出, 我們給出的是所有使用者可讀可寫可執行. 然而由於umask的影響結果卻不如所願

這裡許可權正好為(mode & ~umask).

Linux檔案程式設計之 系統呼叫 open

1 相關函式說明 函式原型 int open const char pathname,int flags int open constchar pathname,int flags,mode t mode 如果使用了o creat標誌,則要使用這個函式,這時需要指定mode來表示檔案的訪問許可權 相...

Linux檔案程式設計之 系統呼叫 close

1 相關函式說明 相關函式 open,fcntl,shutdown,unlink,fclose 表頭檔案 include 定義函式 int close intfd 引數說明 引數fd為先前由open 或creat 所返回的檔案描述詞。當使用完檔案後若已不再需要則可使用close 關閉該檔案,而clo...

Linux檔案程式設計之 系統呼叫 read

1 相關函式說明 函式原型 int read int fd,void buf size t count 相關函式 readdir,write,fcntl,close,lseek,readlink,fread 表頭檔案 include 函式說明 從檔案描述符fd所指定的檔案中,讀取count個位元組,...