【1】檔案IO
必須使用作業系統提供輸入輸出函數來實作檔案的讀寫、定位操作,不能在其他的系統中使用。
檔案描述符: 實際上是一個非負的整形資料,檔案指針是檔案描述的一個軟連接配接
最大資料:0 ~ 1023 打開得檔案袋描述符的個數是1024個
無緩沖:
檔案IO對比标準IO:标準IO通過對正常檔案進行操作,檔案IO通常對特殊檔案記性操作;檔案IO也可以對正常檔案進行讀寫、定位操作。
1、打開或者建立
open(pathname ,flags, mode)//打開
umask就是用來修改檔案權限,
在建立檔案時,可以通過umask對檔案權限進行修改,修改方式
mode & ~umask
(1)先檢視umask是多少?
(2)設定umask值是多少?
(3)建立檔案,然後通過ll filename 檢視檔案的全限
注意:程式設計umask函數來修改
pathname 指定的檔案名字
flags
讀寫操作方式:
O_RDONLY 讀操作
O_WRONLY 寫操作
O_RDWR 讀寫操作
O_CREAT 建立檔案
O_EXCL 表示檔案已經存在,而又重複建立一次,open函數會傳回錯誤,
傳回檔案已經存在的錯誤,對錯誤做處理之後,直接打開檔案就可以
O_APPEND 從檔案末尾位置追加寫入
open(argv[1], O_RDONLY)
open(argv[1], O_WRONLY | O_CREAT | O_TRUNC , 0666)
open(argv[1], O_WRONLY | O_CREAT | O_APPEND, 0666)
檔案IO和标準IO的等價形式:
r <--> O_RDONLY
r+ <--> O_RDWR
w <--> O_WRONLY | O_CREAT | O_TRUNC
w+ <--> O_RDWR | O_CREAT | O_TRUNC
a <--> O_WRONLY | O_CREAT | O_APPEND
a+ <--> O_RDWR | O_CREAT | O_APPEND
2、讀寫、定位
read、write、lseek
ssize_t read(int fd, void *buf, size_t count);
功能: 從指定的檔案中讀取資料
參數:
fd 指定的檔案,通過open函數傳回的檔案描述符
buf 從檔案當中讀取資料存放到使用者程式空間當中,事先定義數組或者
變量傳遞着位址
count 要求從檔案中讀取多少位元組的資料
傳回值:
成功 傳回實際讀取的位元組數
失敗 -1
從指定位置讀取資料時如果指定位置沒有資料read,就會産生阻塞
ssize_t write(int fd, const void *buf, size_t count);
功能: 往指定的檔案中寫入資料
參數:
fd 指定的檔案,通過open函數傳回的檔案描述符
buf 從使用者程式空間當中讀取資料寫入到檔案,事先定義數組或者
變量傳遞着位址
count 要求往檔案中寫入多少位元組的資料
傳回值:
成功 傳回實際寫入的位元組數
失敗 -1
off_t lseek(int fd, off_t offset, int whence);
功能: 重新定位檔案位置指針
參數:
fd open函數打開的檔案
whence 基準點
SEEK_SET
SEEK_CUR
SEEK_END
offset 正數往檔案的末尾位置偏移,負數往檔案的開頭位置偏移,0表示不移動。
lseek(fd, 5, SEEK_SET);
lseek(fd, 0, SEEK_SET);
lseek(fd, 5, SEEK_CUR);
lseek(fd, -5, SEEK_CUR);
lseek(fd, 0, SEEK_CUR);
lseek(fd, 5, SEEK_END);
lseek(fd, -5, SEEK_END);
lseek(fd, 0, SEEK_END);
3、關閉
close
od -c filename 可以檢視檔案中的資料資訊,顯示到終端上
【2】擷取檔案屬性資訊stat
int stat(const char *path, struct stat *buf);
功能:擷取檔案屬性資訊函數
參數:
path 表示要擷取哪個檔案的屬性資訊
buf 需要事先定義一個結構體變量,用來存儲path指向的那個檔案袋額屬性資訊。
傳回值:
成功 0
失敗 -1
【3】 目錄
打開目錄操作
opendir
#include <dirent.h>
DIR *opendir(const char *name);
功能:打開目錄
參數:
name 目錄的名字
傳回值:
成功 DIR*
失敗 NULL
讀取目錄資訊
struct dirent *readdir(DIR *dirp);
struct dirent {
ino_t d_ino; /* inode number */
off_t d_off; /* offset to the next dirent */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported
by all file system types */
char d_name[256]; /* filename 檔案的名字*/
};
功能: 讀取目錄中的檔案資訊
參數:
dirp 你要讀取的目錄是哪一個? 有opendir傳回
傳回值:
成功: struct dirent *(事先頂一個變量接受檔案的資訊)
失敗 NULL(做判斷,是否到大檔案結束或者讀取失敗)
關閉目錄
closedir(DIR*)
【4】庫
(1)什麼是庫?
庫其實就是一個經過編譯之後的二進制檔案,可以被執行,但是不能單獨執行,庫中存放的函數功能的實作,供使用者程式調用,然後把程式中調用函數從庫中添加你的可執行程式中。
(2)庫的分類
靜态庫:
編譯 可執行程式的時候,把庫中的代碼添加可執行程式中,添加完之後,跟靜态庫沒有任何的關系,檔案的大小會變大。執行效率會更高一些
動态庫:(共享庫)
可以被多個程式(程序)共同通路的庫,可執行運作起來之後,去記憶體中,找到共享通路共享庫中的代碼隻是在運作通路,程式接續不在通路檔案的大小沒有變大。相對來說效率更低一些。
(3)庫的制作流程
靜态庫
a、确定函數的功能,添加檔案file.c中, 把檔案制作成庫
b、庫的組成部分是由.o檔案組成,生成.o檔案
c、把.o檔案制作成庫
靜态庫是.a為字尾。以lib開頭, 兩者之間加上庫的名字 libadd.a
ar -crs libmymath.a mymath.o
c 建立
r 插入
s 索引
庫的名字自己定義
d、編譯程式通路庫
指定庫的路徑 -L(表示指定路徑) .(表示目前目錄)
指定庫檔案的名字 -l(指定檔案的名字) add
gcc main.c -o main —L . -ladd
共享庫:
共享庫是.so為字尾。以lib開頭, 兩者之間加上庫的名字 libadd.so
a、gcc -fPIC -c mamath.c -o mymath.o
-fPIC指定位置無關代碼(隻要系統把共享庫加載到記憶體合适的空間中就可以)
b、gcc -shared mymath.o -o libmymath.so
-shared 共享(可以被多個程式調用)
c、gcc main.c -o main -L . -lmymath
執行可執行程式,你會發現不能執行,引文系統找不到庫所在的路徑,使用者必須添加路徑
d1、cp libmymath.so /lib或者/usr/lib
d2、設定共享庫的環境變量LD_LIBRARY_PATH(絕對路徑)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/linux/io-day1/io-day2/dymaic
d3、添加配置檔案在配置檔案中,生成一個.conf的檔案,在檔案中添加共享庫的絕對路徑
cd /etc/ld.so.conf.d
sudo vi mymath.conf
在檔案中添加/home/linux/io-day1/io-day2/dymaic就可以。
【注意】
添加完之後,必須對配置檔案進行重新整理操作
使用ldconfig
删除/etc/ld.so.conf.d/libmymath.so時,必須必須重新整理配置檔案
使用ldconfig