![](/img/trans.png)
[英]Writing a FreeBSD kernel module that handles arbitrary interrupt and output to device
[英]Is writing to a socket an arbitrary limitation of the sendfile() syscall?
序幕
sendfile()
是一個非常有用的系統調用,其原因有兩個:
首先,它的代碼少於read()
/ write()
(或者如果您喜歡jive的話,則為recv()
/ send()
)循環。
其次,它比上述方法更快 (更少的系統調用,實現可以在沒有緩沖區的設備之間進行復制等)。
更少的代碼。 更高效。 太棒了
在UNIX中,所有內容(大部分)都是文件。 這是柏拉圖理論與現實世界相撞的丑陋領域。 我了解套接字與駐留在某些設備上的文件從根本上不同。 我沒有深入研究Linux / * BSD / Darwin /的源代碼,無論什么操作系統實現sendfile()
都知道為什么這個特定的系統調用僅限於寫入套接字(特別是流套接字)。
我只是想知道...
題
是什么限制sendfile()
允許目標文件描述符不是套接字(例如磁盤文件或管道)之外的內容?
我似乎記得這是早期Linux 2.6中引入的限制(2.4沒有限制)。
從2.6.17版本開始,Linux具有類似splice()的系統調用。 更靈活,但效率略低。 Linus談到了用splice()重新實現sendfile。 參見http://kerneltrap.org/node/6505
從根本上講,唯一限制的是“還沒有人寫過代碼”。
但是,我認為沒有人為您提到的這兩種情況編寫代碼的原因是,它們都需要復制數據,這首先消除了使用sendfile
許多優勢。
對於文件到文件sendfile
,您需要一個副本,因為否則,同一頁必須與源文件中的干凈頁和目標文件中的臟頁一樣位於頁緩存中。 我不認為頁面緩存目前是用來處理這種情況的(當然,如果有足夠的動機,可以更改此設置)。
對於文件到管道sendfile
,無論目標進程是否需要獲取數據的私有可寫副本,都需要一個副本。 無論如何,對於這種情況的大多數使用,我們已經有了mmap
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.