UNIX環境程式設計基本函式 檔案IO

2021-07-13 18:18:49 字數 4905 閱讀 8138

參考:《unix環境高階程式設計》中文版第三版

程式設計環境:os x 10.11.5  xcode 7.3.1

下面介紹各類檔案i/o操作。

#include int open(const char * path, int oflag, ...);

int openat(int fd, const char * path, int oflag, ...);

用於開啟或者建立檔案(建立檔案時需要注意flag必須有o_creat這個選項,並指定訪問許可權(通過後面的不定引數)),成功返回檔案描述符,它是乙個非負整數,失敗返回-1。

path是需要開啟或者建立的檔案的名字。如果path是絕對路徑,open()和openat()沒有區別,openat()中的fd引數無效。如果path是相對路徑,對於openat(),fd引數指定了起始路徑,fd也是個檔案描述符,它通過開啟相對路徑所在的目錄來獲得;對於open(),則指定當前目錄為起始路徑。

oflag是一系列的選項,確定開啟方式,如唯讀、只寫、讀寫等等:

#define o_accmode	   0003

#define o_rdonly 00

#define o_wronly 01

#define o_rdwr 02

#define o_creat 0100 /* not fcntl */

#define o_excl 0200 /* not fcntl */

#define o_noctty 0400 /* not fcntl */

#define o_trunc 01000 /* not fcntl */

#define o_nonblock 04000

#define o_ndelay o_nonblock

#define o_sync 010000

#define fasync 020000 /* fcntl, for bsd compatibility */

#define o_direct 040000 /* direct disk access hint */

#define o_largefile 0100000

#define o_directory 0200000 /* must be a directory */

#define o_nofollow 0400000 /* don't follow links */

#define o_noatime 01000000

下面是乙個例子:

#include #include #define	file_mode	(s_irusr | s_iwusr | s_irgrp | s_iroth)

int main()

else

return 0;

}

執行結果:

open file fd: 3

program ended with exit code: 0

上例中建立檔案的方式可以用另外乙個函式來代替:

#include int creat(const char * path, mode_t mode);
成功時返回檔案描述符,失敗時返回-1。它相當於:

open(path, o_wronly | o_creat | o_trunc, mode);
關於mode_t,它表示的是檔案的訪問許可權,有如下的值:

/* file mode */

/* read, write, execute/search by owner */

#define s_irwxu 0000700 /* [xsi] rwx mask for owner */

#define s_irusr 0000400 /* [xsi] r for owner */

#define s_iwusr 0000200 /* [xsi] w for owner */

#define s_ixusr 0000100 /* [xsi] x for owner */

/* read, write, execute/search by group */

#define s_irwxg 0000070 /* [xsi] rwx mask for group */

#define s_irgrp 0000040 /* [xsi] r for group */

#define s_iwgrp 0000020 /* [xsi] w for group */

#define s_ixgrp 0000010 /* [xsi] x for group */

/* read, write, execute/search by others */

#define s_irwxo 0000007 /* [xsi] rwx mask for other */

#define s_iroth 0000004 /* [xsi] r for other */

#define s_iwoth 0000002 /* [xsi] w for other */

#define s_ixoth 0000001 /* [xsi] x for other */

關閉檔案使用的函式:

#include int close(int fd);
需要注意使用了不同的標頭檔案。成功時返回0,出錯時返回-1。

#include off_t lseek(int fd, off_t offset, int whence);
lseek()顯式地為乙個開啟檔案設定偏移量。

通常,讀寫操作都從當前檔案偏移量開始。

fd表示檔案描述符,對應特定的檔案。

offset和whence配合使用:

1)whence是seek_set時,設定偏移量為從檔案開始處offset個位元組;

2)whence是seek_cur時,設定偏移量為從檔案當前偏移位置開始處offset個位元組,offset可正可負;

3)whence是seek_end時,設定偏移量為檔案長度加offset個位元組,offset可正可負。

成功時,返回新的檔案偏移量;出錯時返回-1。

下面是獲取當前檔案偏移量的乙個方法:

off_t offset = lseek(fd, 0, seek_cur);

printf("offset : %lld\n", offset);

注意,lseek只負責記錄檔案偏移量,並不會引起任何的i/o操作。

下面兩個函式才是具體的i/o操作:

#include ssize_t read(int fd, void *buf, size_t nbytes);

ssize_t write(int fd, const void *buf, size_t nbytes);

read()成功返回讀到的位元組,它小於等於nbytes;失敗返回-1。

write()成功返回寫入的位元組;失敗返回-1。

乙個完整的示例:

#include #include #include #define	file_mode	(s_irusr | s_iwusr | s_irgrp | s_iroth)

int main()

;

if( (fd = open("open_test", o_rdwr | o_creat, file_mode)) != -1 )

else

offset = lseek(fd, 0, seek_cur);

printf("offset : %lld\n", offset);

if( 12 == write(fd, tmp, 12))

if ( (0 == lseek(fd, 0, seek_set)) && (read(fd, &s, 100) != -1) )

close(fd);

return 0;

}

結果:

open file fd: 3

offset : 0

write file success

read from file: hello world

program ended with exit code: 0

#include int dup(int fd);

int dup2(int fd, int fd2);

複製乙個現有的檔案描述符。成功則返回新的檔案描述符,失敗則返回-1。

對於dup2(),如果fd2已經開啟,則先關閉;如果fd等於fd2,則dup2()返回fd2,而不是關閉它。

下面的例子複製了標準輸出,之後再使用write寫檔案的話,相當於寫到了標準輸出上:

#include #include int main()

#include int fcntl(int fd, int cmd, ...);
用於改變已經開啟的檔案的屬性。

根據cmd的不同,fcntl()函式有不同的功能:

1)複製已有的檔案描述符,功能同dup、dup2;

2)獲取/設定檔案描述符標誌;

3)獲取/設定檔案狀態標誌;

4)獲取/設定非同步i/o所有權;

5)獲取/設定記錄鎖。

#include #include int ioctl(int fd, int request, ...);
這個函式包含其他函式無法應用到的i/o操作。這裡不特別介紹了。

unix環境程式設計之函式

man 3 strtok man 3 strtok r printf 3 linux programmer s manual printf 3 name printf,fprintf,sprintf,snprintf,vprintf,vfprintf,vsprintf,vsnprintf forma...

unix環境程式設計 檔案I O

unix 系統支援不同程序共享開啟檔案,下面解說核心用於所有i o的資料結構 核心使用了三種資料結構,它們之間的關係決定了檔案共享方面乙個程序對另外乙個程序可能產生的影響 每個程序在程序表中有乙個記錄項,每個記錄項中有一張開啟檔案的描述符的表,每個描述符佔一項,與每個描述符相關聯的是 a 檔案描述符...

unix環境高階程式設計 err檔案

include apue.h include for definition of errno include iso c varialbe aruments static void err doit int,int,const char va list nonfatal error related ...