linux下系統函式總結

2021-09-11 03:32:32 字數 4481 閱讀 3860

函式原型:

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以...