CSAPP第十章學習日誌

2021-10-01 04:24:43 字數 2729 閱讀 7231

乙個linux檔案就是乙個m個位元組的序列,所有的i/o裝置(例如網路、磁碟和終端)都被模式化為檔案,而所有的輸入和輸出都被當做對此項對應的檔案的讀和寫來進行執行。這種裝置優雅的對映為檔案的方式,允許linux核心引出乙個簡單的、低階的應用介面,稱為unix i/o,這使得所有的輸入和輸出都能以一種統一且一致的方式來執行:

開啟(open)

#include

#include

#include

int open (

char

*filename,

int flags,mode_t mode)

; 返回:若成功則為新檔案描述符,若出錯為-

1。

返回的新檔案描述符總是在程序中當前沒有開啟的最小的描述符。

flags引數指明了程序訪問檔案的方式:

關閉

#include

intclose

(int fd)

; 返回:若成功則為0,若出錯則為-

1.

開啟檔案使用完後就要用close函式進行關閉,close函式會釋放fd指向的檔案,並釋放該檔案所占用的檔案描述符。

#include

ssize_t read

(int fd,

void

*buf,size_t n)

; 返回:若成功則為度的位元組數,若eof則為0,若出錯則為-

1。ssize_t write

(int fd,

const

void

*buf,size_t n)

; 犯規:若成功則為寫的位元組數,若出錯則為-

1。

read函式從描述符為fd的當前檔案位置複製最多n個位元組到記憶體位置buf。返回值-1表示乙個錯誤,而返回值0表示eof。否則,返回值表示的是實際傳送的位元組數量。

write函式從記憶體位置buf複製至多n個位元組到描述符fd的當前檔案位置。

ssize_t和size_t的區別在於,ssize_t是有符號的長整型,size_t是為無符號的長整型。

lseek函式dup函式
#include

intdup2

(int oldfd,

int newfd)

; 返回:若成功則為非負的描述符,若出錯則為-

1

dup2函式複製描述符表項oldfd到描述符表項newfd,覆蓋描述符表表項newfd以前的內容。如果newfd已經開啟了,dup2會複製oldfd之前關閉newfd。

目標檔案abcde.txt

一.ffiles1.c

int

main

(int argc,

char

*ar**)

結果:

分析:fd1、fd2、fd3三個檔案描述符開啟檔案abcde.txt共享v-node表,但三個描述符指向的開啟檔案表不相同,分別為檔案、檔案2、檔案3。

使用dup2函式將fd2複製到fd3,使得兩個檔案描述符現在都指向檔案2,所以兩個檔案描述符指向的檔案位置相同,讀了fd1指向的檔案1中的c1=a了之後,讀fd2和fd3指向的檔案2,因為是兩個不同的檔案,不會相互影響,所以檔案2從頭開始讀,所以c2=a,然後fd2會後移,fd3和fd2位置相同所以c3=b。

二.ffiles2.c

int

main

(int argc,

char

*ar**)

else

return0;

}

結果:

分析:前面有講到父子程序是共享檔案位置的,也就不難理解為何子程序c2=b,父程序c2=c了。注(因為sleep函式傳參的不同使得父子程序執行順序有隨機性)

三.ffiles3.c

int

main

(int argc,

char

*ar**)

結果:

分析:fd1以o_creat|o_trunc|o_rdwr建立並開啟了乙個可讀可寫的檔案,如果檔案已存在則將其內容清空;fd3則是可以在檔案末尾對檔案內容進行新增,以只寫的方式開啟檔案。

起初檔案中內容為abcde,但是fd1開啟它的時候就清空了然後往檔案裡面寫資料pqrs。

fd3開啟檔案,在後面加上jklmn,此時檔案中內容為pqrsjklmn,fd1的位置上在j處,fd3位置在檔案末尾。

用dup函式,讓fd2成為fd1的副本,所以fd2的位置也在j處,從j處開始寫入資料wxyz,將jklm覆蓋,留下乙個n,最後再在檔案末尾新增ef,得到結果pqrswxyznef。

————————————日誌到此結束——————————————

第十章 函式

使用def關鍵字 定義個數可變的位置形參 定義個數可變的關鍵字形參 定義預設值引數 定義個數可變的位置形參 deffun1 args 結果為乙個元組 print args fun1 10,20,30 10,20,30 定義個數可變的關鍵字形參 deffun2 args 結果為乙個字典 print a...

第十章 屬性

z屬性 本章也比較簡單稍作介紹 無參屬性就是我們常見的屬性 可以封裝屬性 以執行緒安全方式訪問 有參屬性就是c 中的所引器 匿名型別 如圖遇到如下 具體點就是 上面的注釋也已經講清楚了,定義的型別之後,構造例項,然後初始化屬性。現在詳細說下 編譯器接收到 上圖 先用var 定義乙個型別,但是不具體指...

第十章 屬性

目錄 10.1 無參屬性 10.2 有參屬性 10.3 呼叫屬性訪問器方法時的效能 10.4 屬性訪問器的可訪問性 10.5 泛型屬性訪問器方法 物件導向設計和程式設計的重要原則之一就是資料封裝,意味著型別的字段不應該公開,否則很容易因為不恰單使用欄位而破壞物件的狀態。可將屬性想象成智慧型字段,即背...