系統級I O知識點

2021-10-12 03:17:09 字數 1691 閱讀 4160

每個linux檔案都有乙個型別來表明他在系統中的角色:

套接字:用來與另乙個程序進行跨網路通訊的檔案。

程序通過呼叫open函式開啟乙個已經存在的檔案或者建立乙個新的檔案,如果成功則返回新的檔案描述符,出錯則為-1

int open(char *filename, int flags,mode_t mode)

open函式將filename轉換為乙個檔案描述符(標準輸入0,標準輸出1,標準錯誤2)並返回描述數字,返回的檔案描述符總是在程序中當前沒有開啟的最小描述符,flags引數表明將如果訪問這個檔案:

close函式關閉乙個開啟的檔案

int close (int fd)如果成功返回0,錯誤返回-1

#include

intmain()

解釋:最終的輸出結果為fd2 = 3,因為0,1,2已經被占用,開啟foo.txt時fd1為3,但是由於呼叫close函式關閉了foo.txt所以檔案描述符又被返回了,當再開啟baz.txt時分配給fd2的為當前最小的沒被占用的檔案描述符3.

應用程式通過呼叫read和write函式來執行輸入和輸出

ssize_t read(int fd, void *buf,size_t n):如果成功返回讀的位元組數,如果檔案本身為空則出錯為-1

intmain

(void

)exit(0

);}假設磁碟檔案foobar.txt由6個ascii碼字元「foobar」組成,那以下程式的輸出是什麼?

#include

intmain()

解釋:這兩個程序毫無關係,並且是不同的檔案描述符,開啟這個檔案都是定位於檔案的開頭,各自讀各自的,所以最終c = f;

#include

intmain()

wait

(null);

//父程序等待子程序結束

read

(fd,

&c,1);

//父程序和子程序在檔案中游標的位置是共享的,c = o

printf

("c = %c\n"

,c);

//c = o

exit(0

);}

注意:由於是父程序fork建立的子程序,所以父子程序共享同乙個檔案表,在開啟的檔案中的位置會共享,所以最終結果為c = o

int dup2(int oldfd, int newfd):將oldfd的檔案描述符給newfd,這樣newfd就和oldfd指向同乙個檔案表並且在檔案中游標的位置也共享了,這個時候newfd原來的檔案一斤關閉了,它的檔案表和v-node表項也刪除了

用dup2將標準輸入(檔案描述符為0)重定位到描述符5:dup2(5,0),這樣以後來自鍵盤的都會被輸入到檔案描述5指向的檔案中(更改了輸出路徑)

#include

intmain()

最終c = o

I O知識點彙總

按使用特性 人機互動類外設 印表機 顯示器 滑鼠 鍵盤等 儲存裝置 磁碟 磁帶 光碟等 網路通訊裝置 網路介面 數據機等 按傳輸速率分類 低速裝置 每秒幾個到數百個位元組 kb s 如鍵盤 滑鼠 中速裝置 每秒數千個位元組至數萬個位元組,如雷射印表機 高速裝置 數百個千位元組至千兆位元組 100 k...

二級mysql知識點 Mysql 知識點

1.死鎖回滾策略 死鎖發生時mysql會選擇行數少的事務進行回滾 2.鎖型別 共享鎖,排他鎖 行級鎖 innob record lock 鎖定單條記錄 gap lock 鎖定乙個範圍的記錄 但不包括記錄本身 next key lock 鎖定乙個範圍的記錄 並且包 含記錄本身 這是預設的鎖型別 更新操...

Linux基礎IO知識點總結

檔案使用方式 含義如果指定檔案不存在 r 唯讀 為了輸入資料,開啟乙個已經存在的文字檔案 出錯 w 只寫 為了輸出資料,開啟乙個文字檔案 建立乙個新的檔案 a 追加 向文字檔案尾新增資料 出錯 rb 唯讀 為了輸入資料,開啟乙個二進位制檔案 出錯 wb 只寫 為了輸出資料,開啟乙個二進位制檔案 建立...