函式原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
函式原型: ssize_t read(int fd, void *buf, size_t count);
引數:fd -- open的返回值
buf - 緩衝區, 存放讀取的資料
count -- 緩衝區的最大容量 sizeof(buf)
返回值:
-1: 失敗
>0: 讀出的位元組數
=0: 檔案讀完了
函式原型: ssize_t write(int fd, const void *buf, size_t count);
引數:fd: 檔案描述符, open 返回值
buf: 要往檔案中寫的資料
count: 有效資料的長度
返回值:
-1: 失敗
>0: 寫入的位元組數
函式原型: off_t lseek(int fd, off_t offset, int whence);
whence引數:
seek_set
seek_cur
seek_end
使用:檔案指標移動到頭部:
lseek(fd, 0, seek_set);
獲取檔案指標當前的位置:
int len = lseek(fd, 0, seek_cur);
獲取檔案長度:
int len = lseek(fd, 0, seek_end);
檔案拓展
檔案原大小100k, 拓展為1100k
lseek(fd, 1000, see_end)
最後做一次寫操作
write(fd, "a", 1);
int stat(const char *path, struct stat *buf);
int lstat(const char *path, struct stat *buf);
lstat讀取的鏈結檔案本身的屬性
stat讀取的是連線檔案指向的檔案的屬性
- 追蹤,穿透
獲取檔案屬性
struct stat ;
- st_mode -- 16位整數
0-2 bit -- 其他人許可權
- s_iroth 00004 讀許可權
- s_iwoth 00002 寫許可權
- s_ixoth 00001 執行許可權
- s_irwxo 00007 掩碼, 過濾 st_mode中除其他人許可權以外的資訊
3-5 bit -- 所屬組許可權
- s_irgrp 00040 讀許可權
- s_iwgrp 00020 寫許可權
- s_ixgrp 00010 執行許可權
- s_irwxg 00070 掩碼, 過濾 st_mode中除所屬組許可權以外的資訊
6-8 bit -- 檔案所有者許可權
- s_irusr 00400 讀許可權
- s_iwusr 00200 寫許可權
- s_ixusr 00100 執行許可權
- s_irwxu 00700 掩碼, 過濾 st_mode中除檔案所有者許可權以外的資訊
12-15 bit -- 檔案型別
- s_ifsock 0140000 套接字
- s_iflnk 0120000 符號鏈結(軟鏈結)
- s_ifreg 0100000 普通檔案
- s_ifblk 0060000 塊裝置
- s_ifdir 0040000 目錄
- s_ifchr 0020000 字元裝置
- s_ififo 0010000 管道
- s_ifmt 0170000 掩碼,過濾 st_mode中除檔案型別以外的資訊
(st_mode & s_ifmt) == s_ifreg
當前使用者, 使用哪個使用者呼叫這個函式, 這個使用者就是當前使用者
int access(const char *pathname, int mode);
引數:pathname: 檔名
mode: 4種許可權
r_ok -- 讀
w_ok -- 寫
x_ok -- 執行
f_ok -- 檔案是否存在
返回值:
0 - 有某種許可權, 或者檔案存在
-1 - 沒有, 或檔案不存在
int chmod(const char *filename, int mode);
引數:filename: 檔名
mode: 檔案許可權, 八進位制數
int chown(const char *path, uid_t owner, gid_t group);
函式引數:
path -- 檔案路徑
owner -- 整形值, 使用者id
/etc/passwd
group -- ....., 組id
/etc/group
int truncate(const char *path, off_t length);
引數:
path -- 檔名
length -- 檔案的最終大小
1. 比原來小, 刪掉後邊的部分
2. 比原來大, 向後拓展
int rename(const char *oldpath, const char *newpath);
int chdir(const char *path);
引數: 切換的路徑
char *getcwd(char *buf, size_t size);
返回值:
成功: 當前的工作目錄
失敗: null
引數:buf: 緩衝區, 儲存當前的工作目錄
size: 緩衝區大小
int mkdir(const char *pathname, mode_t mode);
引數:pathname: 建立的目錄名
mode: 目錄許可權, 八進位制的數, 實際許可權:
mode & ~umask
int rmdir(const char *pathname);
引數: 空目錄的名字
dir *opendir(const char *name);
引數: 目錄名
返回值: 指向目錄的指標
struct dirent *readdir(dir *dirp);
引數: opendir的返回值
返回值: 目錄項結構體
struct dirent
;d_type
§ dt_blk - 塊裝置
§ dt_chr - 字元裝置
§ dt_dir - 目錄
§ dt_lnk - 軟連線
§ dt_fifo - 管道
§ dt_reg - 普通檔案
§ dt_sock - 套接字
§ dt_unknown - 未知
int closedir(dir *dirp);
int dup(int oldfd);
oldfd - 要複製的檔案描述符
返回值: 新的檔案描述符
dup呼叫成功:
有兩個檔案描述符指向同乙個檔案
返回值: 取最小的且沒被占用的檔案描述符
int dup2(int oldfd, int newfd);
1)假設newfd已經指向了乙個檔案,首先斷開close與那個檔案的鏈結,newfd指向oldfd指向的檔案,檔案描述符重定向
2)oldfd和newfd指向同乙個檔案
3)newfd沒有被占用,newfd指向oldfd指向的檔案
阻塞和非阻塞是檔案的屬性
普通檔案:hello.c ---》預設不阻塞
終端裝置:/dev/tty ----》預設阻塞
Linux下的系統程式設計總結
1 基本指令,5個背景知識 os,環境變數,檔案型別,shell執行原理,檔案許可權 linux常見指令以及許可權理解 linux下的許可權管理與相關時間概念 linux下的find指令 linux下的黏滯位 sticky bit 2 開發環境 vim gcc,g gdb,ctags,make,ma...
linux系統下常用Vim命令總結
在拉取 或合 需要解決衝突時,經常會用到vim命令,直接按insert鍵改檔案費時費力,相對使用vim快捷鍵方便許多。選擇 v 從游標位置開始,選中游標經過位置,再按一次v結束 複製 yy 複製游標所在的一行 刪除 dd 刪除游標所在行 回退 u 撤銷 移動游標 g 移動游標到第一行行頭 ng 移動...
linux下c mysql程式設計函式總結2
說是c 下的mysql程式設計,其實用的還是mysql自帶的c api,因為在我學習的乙份遊戲的c 源 中,就是直接使用的c api,還有乙份是基於c 封裝的mysq api包,這個我還不了解,以後有時間研究一下。在對mysql的操作中,主要需要熟悉幾個api,這裡我總結了一下我遇到的常用的api以...