linux學習筆記之IO

 

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、

相關文章
相關標籤/搜索