1. 程式人生 > >高級I/O函數

高級I/O函數

sta 共享 半雙工 設置 scrip 共享內存 int 標準 之間

  • pipe 函數

int pipe( int fd[2] );

創建管道,半雙工,字節流,容量默認65536字節。fd[0]用來讀,fd[1]用來寫。

可以用與父子進程間的無名管道,各自關閉一端。

int sockpair(int domain, int type, int protocol, int fd[2]);

創建雙端管道,一端寫另一端讀,限制是只能使用本地協議族AF_UNIX。

  • dup 和 dup2函數

int dup( int file_descriptor );

int dup2( int file_descriptor_one, int file_descriptor_two );

新的描述符和原先的描述符指向相同的文件、管道或者網絡連接,失敗返回-1,總小於 file_descriptor_two。

返回的描述符總是系統當前最小的描述符。標準輸入0, 標準輸出1, 標準錯誤輸出2。

  • readv 和 writev函數

ssize_t readv( int fd, const struct iovec* vector, int count );

ssize_t write( int fd, const struct iovec* vector, int count );

分散讀或者集中寫,成功返回寫/讀的字節數,失敗返回-1.

  • sendfile 函數

ssize_t sendfile( int out_fd, int in_fd, off_t* offset, size_t count );

文件描述符直接直接的數據傳遞,不經過緩沖區,稱為零拷貝。

限制:in_fd必須指向真實的文件,不能是socket和管道。

   out_fd必須是一個socket。

成功返回發送到的字節數失敗返回-1。

  • mmap 和 munmap

void* mmap( void *start, size_t length, int port, int flags, int fd, off_t offset );

int munmap( void* start, size_t length );

進程間的共享內存,前者申請映射,後者釋放。高效的IO沒有額外的數據拷貝。

  • splice 函數

ssize_t splice( int fd_it, loff_t* off_in, int fd_out, loff_t* off_out, size_t len, unsigned int flags );

用於兩個文件描述符之間移動數據,也是零拷貝。

在fd_in如果是管道文件off_in設置為NULL。fd_in不是管道文件,off_in表示從偏移位置讀取數據。

fd_out同理。

限制:fd_in和fd_out必須至少有一個是管道文件的描述符。

  • tee函數

ssize_t tee( int fd_in, int fd_out, size_t len, unsigned int flags );

實現了兩個文件描述符上內容的拷貝。

fd_in和fd_out必須同時是管道文件描述符。

  • fcntl函數

int fcntl( int fd, int cmd, ... );

提供了對描述符的控制(創建新描述符,獲取信息,修改等);

高級I/O函數