1. 程式人生 > >Linux 高階I/O函式

Linux 高階I/O函式

文章目錄

1. pip函式

pip函式用於建立一個管道,用於程序間通訊

#include <unistd.h>
int pip(fd[2]);

引數為包含兩個 int 型整數的陣列指標;

兩個檔案描述符fd[0] 和 fd[1] 構成管道的兩端,一端讀一端寫,單向;若雙向通訊,使用兩個管道;

2. dup 和 dup2 函式

把標準輸入重定向到一個檔案,或者把標準輸出重定向到一個網路連線;

#include <unistd.h>
int dup(int file_descriptor);
int dup2(int file_descriptor_one,int file_descriptor_two);

dup函式建立一個新的檔案描述符,與原有檔案描述符 file_descriptor 指向相同的檔案、管道或者網路連線

dup 返回的檔案描述符總是取系統當前可用的最小整數值;

dup2返回第一個不小於 file_descriptor_two 的整數值

3. readv 函式和 writev 函式

readv 函式將資料從檔案描述符讀到分散的記憶體塊中,即分散讀;

writev 函式則多塊分散的記憶體資料一併寫入檔案描述符中,即集中寫;

#include <sys/uio.h>
ssize_t readv(int fd,const struct iovec* vector,int count);
ssize_t writev(int fd,const struct iovec* vector,int count);
  • fd引數:被操作的目標檔案描述符
  • vector: iovec結構陣列,描述一塊記憶體區
  • count : 陣列長度,即多少塊記憶體資料從 fd 讀出或寫到 fd

4. sendfile 函式

sendfile 函式使用零拷貝技術,在兩個檔案描述符間直接傳遞資料(完全在核心中操作),從而避免了核心緩衝區和使用者緩衝區之間的資料拷貝,效率很高

為在網路上傳輸檔案而設計

#include <sys/sendfile.h>
ssize_t senfile(int out_fd,int in_fd,off_t* offset,ssize_t count);
  • in_fd : 待讀出內容的檔案描述符
    必須是一個真實檔案
  • out_fd : 待寫入內容的檔案描述符
    必須是一個 socket
  • offset : 指定從讀入檔案流的哪個位置開始讀
  • count : 指定傳輸位元組數

5. splice 函式

用於在連個檔案描述符之間移動資料,也是零拷貝操作

#include <fcntl.h>
ssize_t splice(int fd_in, loff_t* off_in, int fd_out, loff_t* off_out, ssize_t len,unsigned int flags)
  • fd_in : 待輸入資料的檔案描述符

  • fd_out : 待輸出資料為檔案描述符

    必須至少一個是管道檔案描述符

  • len : 指定移動資料的長度

  • flags : 控制資料如何移動

6. tee 函式

在兩個管道檔案描述符之間賦複製資料,也是領拷貝操作。它不消耗資料,因此原始檔描述符上的資料仍然可以用於後續的讀操作

#include <fcntl.h>
ssize_t tee(int fd_in, int fd_out, ssize_t len,unsigned int flags );

7. fcntl 函式

提供對檔案描述符的各種控制操作;

#include <fcntl.h>
int fcntl(int fd, int cmd, ... );

在網路程式設計中, fcntl 函式通常用來將一個檔案描述符設定為非阻塞的

int setnonblocking(int fd){
	int old_option = fcntl(fd, F_GETFL);//獲取檔案描述符舊的狀態標誌
	int new_option = old_option | O_NONBLOCK;//設定非阻塞標誌
	fcntl(fd, F_SETFL, new_option );
	return old_option;//返回檔案描述符舊的狀態標誌,以便日後恢復該狀態標誌
}