看板 Linux 關於我們 聯絡資訊
小弟正在學raspberry 由於之前沒接觸Linux系統 有個問題已經困擾小弟好幾個禮拜了 算是跟Linux的Virtual File System比較有關 就是在寫驅動程式的時候 裡面很多區塊都會寫到以下這個 ret = 某個函數() 然後最後會有個return ret 可是我一直搞不明白他要return(回傳)到哪裡去 有時侯譬如說read write的方法 我問過老師 他說在驅動程式裡的return值會先交給VFS處理 然後VFS轉換後再傳給應用程式 所以return的value在kernel看跟在應用程式看的不見得一樣 而且很困擾我的一點是 那個ret我在程式中看不到他需要被使用在其他任何地方 而且常常這段程式一個ret=() 下一段程式又是用相同變數ret=()使用在不同的函數做不一樣的事情 然後有時候要return ret, 但有時候又只return 0. 而且不知道要給誰用 記得以前在學C的時候 每個函數return值都有用意可能會被其他地方用到 所以對於return的想法沒什麼疑問 但這邊我真的搞不太懂這些回傳的意義是什麼 對於各位高手可能是很基本的東西 希望有高手能指點一下 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.249.101.2 ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1509297874.A.F50.html ※ 編輯: TouchAgain (111.249.101.2), 10/30/2017 02:52:31
Lipraxde: 告訴呼叫者自己有沒有正確執行完 10/30 08:13
Bencrie: 去讀 API reference manual 10/30 09:03
filiaslayers: 原po是程式新手? 10/30 10:04
galic: 你有注意到goto嗎 10/30 10:26
galic: 哦我看懂你的問題了... 你沒有疑惑驅動的函式是誰呼叫的? 10/30 10:34
galic: 或是怎麼被呼叫的 10/30 10:34
感謝各位回答 我再去看了各位說的 不知我有沒有解讀錯誤 再請各位幫忙看一下對不對 我以最簡單的一個write 為例 我去linux網站找到API說明如下 int copy_from_user_toio(volatile void __iomem * dst, const void __user * src, size_t count) copy data from user-space to mmio-space Parameters volatile void __iomem * dst the destination pointer on mmio-space const void __user * src the source pointer on user-space size_t count the data size to copy in bytes Description Copies the data from user-space to mmio-space. Return Zero if successful, or non-zero on failure. 以下程式碼 static int demo_write(struct file *filp, const char __user *buff, size_t count, loff_t *ppos) { int ret; int len; printk("call demo_write\n"); len=copy_from_user( &result, buff, count); ret=len; return ret; } 將資料copy (count bit)從用戶空間(buff)到核心空間(&result) 之後 必須傳回一個零 代表成功 這是不是說如果沒有return ret;這一行 VFS就會認為這一個動作沒有完成呢? 然後會有訊息告訴用戶? 否則的話那行程式應該只要用 copy_from_user( &result, buff, count);//這樣就可以了? 這裡我還有一個問題 就是最後一定要用ret這個字才可以嗎? 我可不可以不要 ret= len; 這行 直接用return len; 或者直接return copy_from_user( &result, buff, count); 因為我看很多地方都會這樣 不知道是有用意 還是說只是大家寫的習慣而已? ※ 編輯: TouchAgain (111.249.101.2), 10/30/2017 15:59:10 ※ 編輯: TouchAgain (111.249.101.2), 10/30/2017 16:00:37
filiaslayers: 喔喔,看懂你的問題了orz 10/30 16:03
galic: 感覺你想的怪怪的... manual說的回傳值是指copy_from_user 11/03 12:29
galic: 呼叫之後的回傳值 0或非0代表copy_from_user有沒有成功執行 11/03 12:30
galic: 不是說執行之後,你呼叫的函式還要另外回傳0或非0 11/03 12:31
galic: 所以跟VFS什麼的都完全沒有關係 11/03 12:32
galic: 這邊的 ret=len 是多餘的 跟你說的另外兩個寫法一致 11/03 12:33
galic: 但這三種寫法有沒有差 也是編譯器先判定的 跟VFS也完全沒關 11/03 12:33
galic: 而且這種kernel address space和user address space之間的 11/03 12:35
galic: 資料搬移是涉及到memory management的設計 跟file system的 11/03 12:36
galic: VFS無關 11/03 12:37
galic: 還是你想說 "virtual memory" 11/03 12:38
感謝回復 如果照您說的話 執行函數後函數本身就會回傳0確認動作完成 不需要另外寫一行return回傳 那請問最後面我們再加return意義是什麼? 因為我一開始的想法就是這樣 因為我看不到誰來接收這個return值 或者對return值做判斷 照理講應該是call這整段程式的user會收到他的回傳值然後做出判斷 但是在user的程式中並沒有對回傳值做任何判斷或動作 user 程式只有以下這一行: result = write(fd,&data,sizeof(data)); 而且我不確定這裡收到的回傳值result是否會等於kernel內return出來的 因為我老師說中間還會經過轉換 ※ 編輯: TouchAgain (61.228.245.157), 11/03/2017 13:28:47 ※ 編輯: TouchAgain (61.228.245.157), 11/03/2017 13:37:18
seaseacola: 你的範例怪怪的. 看 kernel 使用 copy_from_user 11/03 19:56
seaseacola: 的其他 driver 應該就能理解 11/03 19:56
galic: 我突然覺得你應該發在 LinuxDev 版之類的... 11/04 21:16
galic: 總之 demo_write() 裡面呼叫的那些函式 都會有回傳值 只是 11/04 21:17
galic: 看demo_write()裡面要怎麼處理 demo_write()本身的回傳值 11/04 21:17
galic: 則是呼叫 demo_write() 的函式處理的... 所以你應該先知道 11/04 21:18
galic: 誰會呼叫 demo_write() 以及呼叫 demo_write() 的函式預期 11/04 21:18
galic: demo_write() 回傳什麼結果給他 11/04 21:18
galic: 這不管是不是kernel程式,而是跟一般 C 程式的概念都一致 11/04 21:19
galic: 並不會因為今天是kernel程式就會有處理上面的不同 11/04 21:19
TouchAgain: 好的 了解你的意思了 感謝! 11/04 22:41