[問題] 請問回傳的問題?

看板Linux作者 (謝謝)時間6年前 (2017/10/30 01:24), 6年前編輯推噓3(3025)
留言28則, 6人參與, 6年前最新討論串1/1
小弟正在學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

10/30 08:13, 6年前 , 1F
告訴呼叫者自己有沒有正確執行完
10/30 08:13, 1F

10/30 09:03, 6年前 , 2F
去讀 API reference manual
10/30 09:03, 2F

10/30 10:04, 6年前 , 3F
原po是程式新手?
10/30 10:04, 3F

10/30 10:26, 6年前 , 4F
你有注意到goto嗎
10/30 10:26, 4F

10/30 10:34, 6年前 , 5F
哦我看懂你的問題了... 你沒有疑惑驅動的函式是誰呼叫的?
10/30 10:34, 5F

10/30 10:34, 6年前 , 6F
或是怎麼被呼叫的
10/30 10:34, 6F
感謝各位回答 我再去看了各位說的 不知我有沒有解讀錯誤 再請各位幫忙看一下對不對 我以最簡單的一個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

10/30 16:03, 6年前 , 7F
喔喔,看懂你的問題了orz
10/30 16:03, 7F

11/03 12:29, 6年前 , 8F
感覺你想的怪怪的... manual說的回傳值是指copy_from_user
11/03 12:29, 8F

11/03 12:30, 6年前 , 9F
呼叫之後的回傳值 0或非0代表copy_from_user有沒有成功執行
11/03 12:30, 9F

11/03 12:31, 6年前 , 10F
不是說執行之後,你呼叫的函式還要另外回傳0或非0
11/03 12:31, 10F

11/03 12:32, 6年前 , 11F
所以跟VFS什麼的都完全沒有關係
11/03 12:32, 11F

11/03 12:33, 6年前 , 12F
這邊的 ret=len 是多餘的 跟你說的另外兩個寫法一致
11/03 12:33, 12F

11/03 12:33, 6年前 , 13F
但這三種寫法有沒有差 也是編譯器先判定的 跟VFS也完全沒關
11/03 12:33, 13F

11/03 12:35, 6年前 , 14F
而且這種kernel address space和user address space之間的
11/03 12:35, 14F

11/03 12:36, 6年前 , 15F
資料搬移是涉及到memory management的設計 跟file system的
11/03 12:36, 15F

11/03 12:37, 6年前 , 16F
VFS無關
11/03 12:37, 16F

11/03 12:38, 6年前 , 17F
還是你想說 "virtual memory"
11/03 12:38, 17F
感謝回復 如果照您說的話 執行函數後函數本身就會回傳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

11/03 19:56, 6年前 , 18F
你的範例怪怪的. 看 kernel 使用 copy_from_user
11/03 19:56, 18F

11/03 19:56, 6年前 , 19F
的其他 driver 應該就能理解
11/03 19:56, 19F

11/04 21:16, 6年前 , 20F
我突然覺得你應該發在 LinuxDev 版之類的...
11/04 21:16, 20F

11/04 21:17, 6年前 , 21F
總之 demo_write() 裡面呼叫的那些函式 都會有回傳值 只是
11/04 21:17, 21F

11/04 21:17, 6年前 , 22F
看demo_write()裡面要怎麼處理 demo_write()本身的回傳值
11/04 21:17, 22F

11/04 21:18, 6年前 , 23F
則是呼叫 demo_write() 的函式處理的... 所以你應該先知道
11/04 21:18, 23F

11/04 21:18, 6年前 , 24F
誰會呼叫 demo_write() 以及呼叫 demo_write() 的函式預期
11/04 21:18, 24F

11/04 21:18, 6年前 , 25F
demo_write() 回傳什麼結果給他
11/04 21:18, 25F

11/04 21:19, 6年前 , 26F
這不管是不是kernel程式,而是跟一般 C 程式的概念都一致
11/04 21:19, 26F

11/04 21:19, 6年前 , 27F
並不會因為今天是kernel程式就會有處理上面的不同
11/04 21:19, 27F

11/04 22:41, 6年前 , 28F
好的 了解你的意思了 感謝!
11/04 22:41, 28F
文章代碼(AID): #1PzWxIzG (Linux)