1、基礎知識。ios
1:普通IO類型。數據庫
1,非阻塞IO:發出open/read/write等IO操做,並使這些操做不會永遠阻塞。當不能完成時,會當即出錯返回。數組
1)非阻塞的兩種標誌方式:指定標誌:O_NONBLOCK。服務器
2)非阻塞語義:文件狀態標誌的更改影響同一文件表項的全部用戶,但與經過其餘文件表項對同一設備的訪問無關。(關聯於文件表項)網絡
2,異步IO(asynchronous IO)。異步
1)機制:當描述符準備號能夠進程IO時,發送一個信號通知進程。async
1-僅當描述符引用中斷設備或網絡時,它才能起做用。函數
2-這種信號對每一個進程都只有一個。spa
3:IO多路轉接(IO multiplexing)。操作系統
1)機制:構造一個包含描述符的列表,而後調用一個函數。當描述符中的一個準備好進程IO操做時,該函數才返回。
2)系統並不主動告知任何信息。須要咱們使用函數取查詢文件描述符。
4:POSIX異步IO:爲不一樣類型的文件進行異步IO提供例一套一致的方法。
1)異步IO操做必須顯式的指定偏移量。異步IO接口並不影響由操做系統維護的文件偏移量。
2)使用追加模式時,aio_offset字段會被系統忽略。
5:儲存映射IO。
1)機制:將一個磁盤文件映射到儲存空間中的一段緩衝區上。
2:終端IO。
1,兩種工做模式。
1)規範模式輸入處理:按行處理,以行爲結束。默認爲規範模式。
2)非規範模式輸入處理:按各自的規則處理。
3)規範模式下,有下列幾種狀況會形成讀返回:請求字節數已讀到,接收到行定界符,捕捉到信號。
4)非規範模式的四種狀況。TIME和MIN是termios結構中c_cc數組的兩個變量。
\ | MIN > 0 | MIN == 0 |
TIME > 0 | A:在定時器超時前, read返回[MIN, nbytes]; 若是定時器超時, read返回[1, MIN]; (TIME=字節間定時器。調用者無限期阻塞。) |
C:在定時器超時前, read返回[1, nbytes]; 若是定時器超時, read返回0. (TIME=read定時器) |
TIME == 0 | B:當有可用數據時, read返回:[MIN, nbytes] (調用者可無限期阻塞) |
D:read當即返回[0, nbytes] |
2,POSIX.1 定義了11個特殊輸入字符,其中9個能夠更改。
3,終端設備是由一般位於內核中的終端驅動程序控制的,每一個終端設備都由一個輸入隊列和一個輸出隊列。
1)輸入隊列填滿時,系統性爲依賴實現。
2)輸出隊列填滿時,進程一般休眠。直到隊列有可用空間。
4,終端IO函數彙總。
函數 | 說明 |
tcgetattr | 獲取屬性 |
tcsetattr | 設置屬性 |
cfgetispeed | 獲取輸入速度 |
cfgetospeed | 獲取輸出速度 |
cfsetispeed | 設置輸入速度 |
cfsetospeed | 設置輸出速度 |
tcdrain | 等到全部輸出都被傳輸 |
tcflow | 掛起 傳輸或接收 |
tcflush | 沖洗未決輸入和/或輸出 |
tcsendbreak | 發送BREAK字符 |
tcgetpgrp | 得到前臺進程組ID |
tcsetpgrp | 設置前臺進程組ID |
tcgetsid | 獲得控制TTY的會話首進程的進程組ID |
5,波特率:指位/秒(bit per second)。
1)通常系統都定義了協議之外的波特率。
6,僞終端。
1)含義:指對於一個應用程序而言,它看上去像一個終端。但事實上並非一個真正的終端。
2)幾個經典的用途P581(未徹底瞭解。)。
1-網絡登陸服務器。
2-窗口系統終端模擬。
3-script程序。
4-expect程序。
5-運行協同進程。
6-觀看長時間運行的程序的輸出。
3:IO相關:記錄鎖功能
1,記錄鎖功能(字節範圍鎖):一個進程正在讀/修改文件的某個部分時,使用記錄鎖能夠阻止其餘進程修改同一個文件區。
1)它能夠只鎖住文件的一段區域。控制上更爲精確。
2)共享讀和獨佔寫的控制模式和讀寫鎖相似。
3)單個進程在同一區域設置第二把鎖時,會覆蓋以前的鎖。
4)加讀鎖時,描述符必須時讀打開;加寫鎖時,必須是寫打開。
2,鎖的隱含繼承和釋放。
1)當一個進程終止時,它創建的鎖所有釋放。當一個描述符關閉時,進程經過描述符設置的鎖也會釋放。
2)由fork產生的子進程不繼承父進程設置的鎖。
3)執行exec後,新程序能夠繼承原執行程序的鎖(和上條彷佛存在矛盾)。
3,合做進程:一個庫的全部函數都以一致的方法處理記錄鎖,則稱使用這些函數訪問數據庫的進程集爲合做進程。
4,強制性鎖:該鎖會讓內核見車每個IO函數,驗證調用進程是否違背了正在訪問的文件上的某一把鎖。
1)打開方式:對特定文件打開其設置組ID位,關閉組執行位(沒法理解)。
2)建議鎖的含義?
3)強制性鎖存在缺陷,是能夠避開的。
4:其餘。
1,輪詢:一段時間,調用一次指望的進程/函數。
1)多任務系統中,儘可能避免使用此方法。
2,BSD派生系統中,異步IO是信號SIGIO 和 SIGURG 的組合。
1)SIGIO:通用異步IO信號。
2)SIGURG:通知進程網絡鏈接上的帶外數據已經到達。
2、相關函數。
1:多路轉接IO
<sys/select.h>
1 多路轉接的查詢函數。 int select( int maxfdp1, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds, struct timeval *restrict tvptr ); // 1 輸入:描述符,描述符條件(讀/寫/異常),等待時間。 // 2 輸出:描述符總量,已準備好的描述符條件 // 3 參數tvptr: ==NULL 永遠等待, ==0 不等待, !=0 等待具體時間。無const,沒法保證不被修改。。 // 4 fd_set類型參數(寫/讀/異常條件): 當參數==NULL時,表示不關心此參數。 // 5 參數maxfdp1:最大文件描述符編號+1. // 6 返回值:出錯-1,0 表示沒準備好的描述符, >0 已準備好的描述符數之和。 int pselect( int maxfdp1, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds, const struct timespec *restrict tsptr, const sigset_t *restrict sigmask ); // 1 提供高精度,並超時值沒法改變。 // 2 可以使用 信號屏蔽字。 int poll( struct pollfd fdarray[], nfds_t nfds, int timeout ); // 1 將咱們感興趣的描述符寫進 pollfd 數組中。 // 2 參數 nfds:指定數組元素個數。 // 3 參數timeout:-1 永遠等待,0 不等待,>0 等待具體時間。 2 數據類型 fd_set 的處理函數/宏(取決於實現成函數,仍是宏)。 int FD_ISSET( int fd, fd_set *fdset ); // 指定位是否已打開。 void FD_CLR( int fd, fd_set *fdset ); // 清除某一個位。 void FD_SET( int fd, fd_set *fdset ); // 設置某一個位。 void FD_ZERO( fd_set *fdset ); // 全部位設置爲0。 // 1 fd_set類型中,一個文件描述符佔據一位。一般來講 位上置1 表示條件知足(不肯定具體系統實現)。 3 數據類型 pollfd。 struct pollfd { int fd; // file decriptor to check, or <0 to ignore. short events; // events of interest on fd. short revents; // events that occurred on fd. } // 1 若是使用此結構,須要直到具體的event返回值的含義
2:POSIX異步IO
1 AIO控制塊基本結構(具體系統可在標準上添加) struct aiocb { int aio_fildes; // file descriptor off_t aio_offset; // file offset for IO volatile void *aio_buf; // buffer for IO size_t aio_nbytes; // number of bytes to transfer int aio_reqprio; // priority struct sigevent aio_sigevent; // signal information int aio_opcode; // operation for list IO } 2 基本讀寫操做。 int aio_read( struct aiocb * aiocb ); int aio_write( struct aiocb * aiocb ); 3 強制等待的異步操做直接寫入。 int aio_fsync( int op, struct aiocb *aiocb ); // !!!具體功能未徹底確認!!! // 1 op參數有兩個選擇:O_DSYNC---fdatasync, O_SYNC---fsync 4 獲取一個操做完成狀態。 int aio_error( const struct aiocb *aiocb ); // 1 返回值:0 成功,-1失敗 errno中保存錯誤信息,EINPROGRESS 操做等待中, 5 若是成功,獲取異步操做返回值。 ssize_t aio_return( const struct aiocb *aiocb ); // 1 調用一次後,系統就清除返回值。 6 進程只剩異步操做未完成,能夠經過此函數阻塞進程。直到異步操做完成。 int aio_suspend( const struct aiocb *const list[], int nent, const struct timespec *timeout ); 7 取消等待的異步操做。 int aio_cancel( int fd, struct aiocb *aiocb ); // 僅發出取消命令,並不表明必定取消。 // 1 返回值:AIO_ALLDONE 全部操做已完成,不須要取消, AIO_CANCELED 成功, AIO_NOTCANCELED 最少有一個操做沒被取消, -1 調用失敗,錯誤保存在errno 8 提交一個 AIO控制塊的 列表 int lio_listio( int mode, struct aiocb *restrict const list[ restrict ], int nent, struct sigevent *restrict sigev ); // 1 參數mode:LIO_WAIT, LIO_NOWAIT
3:儲存映射IO。
1 將給定文件映射到儲存區域。 void *nmap( void *addr, size_t len, int prot, int flag, int fd, off_t off ); // 1 參數addr:指定映射區域的起始地址。設置爲0獲得最大的可移植性。 // 2 參數prot:儲存區的權限(讀/寫/執行) // 3 參數flag:MAP_FIXED,MAP_SHARED,MAP_PRIVATE. 2 更改映射權限。 int mprotect( void *addr, size_t len, int prot ); 3 將儲存區數據寫入被映射文件。 int msync( void *addr, size_t len, int flags ); // 1 參數flags:MS_ASYNC, MS_SYNC 4 解除映射區。 int munmap( void *addr, size_t len ); // 調用此函數,不會使儲存區數據寫入文件
4:多種讀寫函數。
1 讀/寫 多個緩衝區 ssize_t readv( int fd, const struct iovec *iov, int iovcnt ); ssize_t writev( int fd, const struct iovec *iov, int iovcnt ); // 1 參數iovcnt:讀取緩衝區的個數。 2 按照需求 讀/寫 N個字節的數據 ssize_t readn( int fd, void *buf, size_t nbytes ); ssize_t writen( int fd, void *buf, size_t nbytes );
5:記錄鎖
int fcnt1(int fd, int cmd, struct flock *flockptr ); struct flock { short l_type; // F_RDLCK(共享讀鎖), F_WRLCK(獨佔寫鎖), F_UNLCK(解鎖一個區域) short l_whence; // 加/解鎖區域的起始字節偏移量。可選值:SEEK_SET, SEEK_CUR, SEEK_END off_t l_start; // 加/解鎖區域的起始字節偏移量。 off_t l_len; // 區域字節長度.等於0時,表示能夠添加爲最大偏移量,而不是0。 pid_t l_pid; // 當前進程ID(cmd == F_GETLK 時) } // 1 對於記錄鎖,參數cmd是: F_GETLK(獲取鎖狀態), F_SETLK(設置鎖), F_SETLKW(設置鎖的阻塞版,W==wait)。 // 2 參數flockptr時記錄鎖的一個結構體。 // 3 使用參數cmd 獲取/設置鎖 的操做都不是原子操做。
3、