Linux網路程式設計筆記 第三章,檔案系統簡介

2021-10-11 11:12:32 字數 4363 閱讀 5592

目錄

一,linux下的檔案系統

1,linux下檔案主要分為一下幾種

2,檔案系統的建立

二,檔案的通用操作方法

1,檔案描述符

2,開啟建立open(),create()函式介紹

3,關閉檔案close()函式

4,讀取檔案read()函式

5,寫檔案write()函式

6,檔案偏移lseek()函式

7,獲得檔案狀態fstat()函式

8,檔案空間對映mmap()函式

9,檔案屬性fcntl()函式

10,檔案輸入輸出控制ioctl()函式

unix下一切皆檔案

在linux中使用者對各種檔案的操作是類似的,因為虛擬檔案系統vfs提供了同一套api

2.1 系統分割槽情況

linux系統中有三個已經分配的檔案描述符

open() 開啟乙個已經存在的檔案或建立乙個新檔案

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

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

返回值:成功返回檔案描述符,失敗返回-1

#include #include #include #include int main()

else

return 0;

}

create() 建立乙個新檔案

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

int close(int fd)

4.1 用read函式從開啟檔案中讀資料,使用者可以對讀入的資料進行操作。

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

read()函式從檔案描述符對應的檔案中讀取count位元組,放到buf開始的緩衝區

4.2 read()函式例子

#include #include #include #include #include int main()

else

while (size)

else

else

size = write(fd, buf, sizeof(buf));

printf("write %d byte to file %s\n", size, filename);

return 0;

}

6.1 lseek()函式可以設定檔案偏移量的位置

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

這個函式對檔案描述符fd所代表的檔案,按照操作模式whence和偏移的大小offset,重新設定檔案的偏移量

whence和offset結合使用。whence表示操作的模式,offset是偏移的值

6.2lseek()函式的通用例子

#include #include #include #include #include int main()

else

return 0;}

stdin can't seek //標準輸入不能進行lseek操作

6.3 空洞檔案的例子

#include #include #include #include #include int main()

size = write(fd, buf1, len);

if (size != len)

offset = lseek(fd, 32, seek_set);

if (-1 == offset)

else

size = write(fd, buf2, len);

if(size != len)

close(fd);

return 0;

}

7.1 在程式設計的時候經常要用到檔案的一些特性值,例如檔案的所有者,檔案的修改時間,檔案的大小等。stat()函式,fstat()函式和lstat()函式可以獲得檔案的狀態。

int stat(const char *pathname, struct stat *statbuf);

int fstat(int fd, struct stat *statbuf);

int lstat(const char *pathname, struct stat *statbuf);

struct stat  

;

7.2 stat()函式的例子

#include #include #include #include int main(void)

printf("包含此檔案的裝置id:%d\n",(int)st.st_dev); /*檔案的id號*/

printf("此檔案的節點:%d\n",(int)st.st_ino); /*檔案的節點*/

printf("此檔案的保護模式:%d\n",(int)st.st_mode); /*檔案的模式*/

printf("此檔案的所有者id:%d\n",(int)st.st_uid); /*檔案的所有者id*/

printf("此檔案的所有者的組id:%d\n",(int)st.st_gid); /*檔案的組id*/

printf("裝置id(如果此檔案為特殊裝置):%d\n",(int)st.st_rdev); /*檔案的裝置id*/

printf("此檔案的大小:%d\n",(int)st.st_size); /*檔案的大小*/

printf("此檔案的所在檔案系統塊大小:%d\n",(int)st.st_blksize); /*檔案的系統塊大小*/

printf("此檔案的占用塊數量:%d\n",(int)st.st_blocks); /*檔案的塊大小*/

return 0;

}

8.1 mmap()函式介紹

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)

mmap()函式將檔案描述符fd對應的檔案中,自offset開始的一段長length的資料空間對映到記憶體中。

prot:prot的值是乙個組合值,可以是乙個或多個。prot_write | prot_read的方式將對映區設定為可讀寫,port的設定受檔案開啟時的選項設定,當開啟檔案為唯讀時,寫失效,讀有效。

length:對映資料的長度,即檔案對映到記憶體中的資料大小

prot_exec:對映區域可執行

prot_read:對映區域可讀取

prot_write:對映區域可寫入

prot_none:對映區域不能訪問

返回值

8.2 munmap()函式介紹

int munmap(void *addr, size_t length)

8.3mmap(),munmap()函式例子

#include #include #include #include #include #include #include #define filelength 80

int main(void)

lseek(fd, filelength-1, seek_set);

write(fd, "a", 1);

ptr = mmap(null, filelength, prot_read | prot_write, map_shared, fd, 0);

if ((char*)-1 == ptr)

memcpy(ptr+16, buf, strlen(buf));

munmap(ptr, filelength);

close(fd);

return 0;

}

9.1int fcntl(int fd, int cmd, ... /* arg */ )

fcntl()函式向開啟的檔案fd傳送命令,更改其屬性

fd:檔案描述符

返回值:命令不同,返回值也不同

10.1 int ioctl(int d, int request, ...)

ioctl()函式通過對檔案描述符傳送特定的命令來控制檔案描述符所代表的裝置

10.2 ioctl()函式例子

#include #include #include #include int main(void)

if (ioctl(fd, cdromeject, null) >= 0)

else

return 0;

}

第三章Linux網路基礎程式設計

原始碼 於華清 1.tcp程式設計 客戶端 同乙個網段就可以通訊 過程詳細的得看具體的資料,在這只是個簡單的模版,方便自己查閱 include include include include include include include define n 64 typedef struct soc...

unix 網路程式設計 第三章

包裹函式 就是對有錯誤返回值的函式的封裝。在unix網路程式設計中用大寫表示。err sys 必須要errno 的值才能輸出錯誤?執行緒函式遇到錯誤的時候 不設定errno的值,而是把error的值作為函式的返回值。必須檢查某個確定的錯誤,並處理它,而不是終止程序執行。unix errno 值 每當...

第三章筆記

第三章預習筆記 一 高階語言和機器指令中的運算 1,按位運算 符號 按位or運算 符號 按位and運算 符號 表示按位not運算 符號 按位xor運算。實現掩碼操作 通過與給定的乙個位模式進行按位與,可以提取所需要的位,對這些位進行 置1 清0 等。2,符號 按位or運算 符號 表示and運算 符號...