splice() - Unix,Linux系統呼叫 - 技術教學
Tutorials Point


  Unix入門
  Unix Shell程式設計
  高階Unix
  Unix有用參考
  Unix有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考     討論區     關於TP  

splice() - Unix,Linux系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

splice - 將資料拼接進/出管道

概要

#define _GNU_SOURCE 
#include <fcntl.h> 

long splice(int fd_in, off_t *off_in, int fd_out, off_t *off_out, size_t len ", unsigned int " flags );

描述

splice()在兩個檔案描述符之間移動資料,無需在核心地址空間和使用者地址空間之間複製。它最多傳輸len位元組的資料,從檔案描述符fd_in到檔案描述符fd_out,其中一個描述符必須指向管道。

如果fd_in指向管道,則off_in必須為NULL。如果fd_in不指向管道且off_in為NULL,則從當前檔案偏移量開始讀取fd_in中的位元組,並相應調整當前檔案偏移量。如果fd_in不指向管道且off_in不為NULL,則off_in必須指向一個緩衝區,該緩衝區指定從fd_in讀取位元組的起始偏移量;在這種情況下,fd_in的當前檔案偏移量不會更改。類似的陳述適用於out_fdoff_out

flags引數是一個位掩碼,它由將以下一個或多個值組合在一起形成。

標籤描述
SPLICE_F_MOVE 嘗試移動頁而不是複製。這只是對核心的一個提示:如果核心無法從管道移動頁,或者管道緩衝區未引用完整頁,則仍然可能複製頁。
SPLICE_F_NONBLOCK 不要阻塞I/O。這使splice管道操作非阻塞,但是splice()可能仍然會阻塞,因為被拼接到的檔案描述符可能會阻塞(除非它們設定了O_NONBLOCK標誌)。
SPLICE_F_MORE 後續將有更多資料進入splice。當fd_out指向套接字時,這是一個有用的提示(另請參見send(2)中MSG_MORE的描述,以及tcp(7)中TCP_CORK的描述)。
SPLICE_F_GIFT splice()未使用;參見vmsplice(2)。

返回值

成功完成後,splice()返回拼接進或出管道的位元組數。返回值為0表示沒有資料要傳輸,並且阻塞沒有意義,因為沒有寫入器連線到由fd_in引用的管道的寫入端。

發生錯誤時,splice()返回-1,並設定errno以指示錯誤。

錯誤

標籤描述
EBADF 一個或兩個檔案描述符無效,或者沒有正確的讀寫模式。
EINVAL 目標檔案系統不支援拼接;兩個描述符都不指向管道;或為非可定址裝置提供的偏移量。
ENOMEM 記憶體不足。
ESPIPE off_inoff_out不為NULL,但相應的檔案描述符指向管道。

版本

splice(2)系統呼叫首次出現在Linux 2.6.17中。

符合標準

此係統呼叫是Linux特有的。

備註

三個系統呼叫splice(2)、vmsplice(2)和tee(2)為使用者空間程式提供了對任意核心緩衝區的完全控制,在核心中使用與管道相同的緩衝區型別實現。總的來說,這些系統呼叫執行以下任務:
標籤描述
splice() 將資料從緩衝區移動到任意檔案描述符,反之亦然,或從一個緩衝區移動到另一個緩衝區。
tee(2) 將資料從一個緩衝區“複製”到另一個緩衝區。
vmsplice(2) 將資料從使用者空間“複製”到緩衝區。
雖然我們談論的是複製,但通常會避免實際複製。核心透過將管道緩衝區實現為指向核心記憶體頁面的引用計數指標集來實現此目的。核心透過建立指向頁面的新指標(用於輸出緩衝區)並增加頁面的引用計數來建立緩衝區中的頁面的“副本”:只複製指標,不復制緩衝區的頁面。

示例

參見tee(2)。

另見



previous next Printer Friendly

廣告


  

廣告



廣告
© . All rights reserved.