2014-05-06 37 views
3

在以下功能,從LDD採取:之所以使用參數loff_t *石油換食品計劃,而不是直接filp-> f_pos使用

ssize_t read(struct file *filp, char __user *buff, size_t count, loff_t *offp); 
ssize_t write(struct file *filp, const char __user *buff, size_t count, loff_t *offp); 

爲什麼還有的loff_t *offp的需要?我不能直接使用filp更新f_pos

此外,在54頁的作者說:

讀寫會使用它們接收到的最後一個參數,而不是作用於filp->f_pos直接指針更新的位置。這是一個例外...

好的,所以最好使用offp指針,但爲什麼?

回答

2

filp->f_pos是當前指針在文件中的位置,而offp是用戶訪問文件的位置。您在成功讀取/寫入操作時前進文件指針,如果失敗,則不應更改文件指針。內核自己做,如果你成功地讀/寫它會改變filp->f_posoffp。引用LDD3:

無論數據的方法轉移量,他們應該 通常在更新石油換食品計劃*文件位置來表示系統調用成功完成之後當前 文件中的位置。內核然後在適當時將文件位置改變傳播迴文件 結構。

+0

我沒有想到這一點,最重要的是,offp指針是指示設備關於「我想要讀/寫的位置」的介質。如果沒有(所以只有3個參數),系統調用容器應該使用複雜的設備來保存舊的f_pos,使用llseek,調用讀/寫,然後決定接受修改後的filp的f_pos或恢復保存的。我對嗎?謝謝。 –

+0

是的,你是對的。隨機閱讀也會很尷尬。 –

0

其中一個原因可能是支持pread,pwrite,preadv,pwritev syscalls,它們將偏移量作爲參數之一,並指定不更新文件位置。讓底層代碼實現一些與p *函數接近的東西似乎更清晰,然後使用filp-> f_pos的包裝並更新普通的read/write/readv/writev系統調用的位置。

+0

因此,據我的理解,你的評論,因爲file_operations的寫(或讀)容器只是一個(但系統調用不是),內核需要一個靈活的方式來翻譯各種寫/讀和各種寫入/ pread在一個單一的函數調用中,因此必須具有允許異構性的靈活性。我對嗎? –

+0

遵循相同的理由,它將取決於實現單個系統調用的容器函數,以決定是否更新f_pos。此外,在進行簡單的寫入系統調用之前,爲了自動更新文件指針,像writefunc(&myFilp,&myBuf,xxx,&(myFilp-> f_pos))這樣的write函數的簡單調用就足夠了,因爲當writefunc更新offp指針的目標,直接更新filp-> f_pos。我遵循正確的理由嗎?謝謝。 –

相關問題