[問題] 請問回傳的問題?
小弟正在學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
10/30 09:03, 2F
推
10/30 10:04,
6年前
, 3F
10/30 10:04, 3F
→
10/30 10:26,
6年前
, 4F
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
10/30 16:03, 7F
→
11/03 12:29,
6年前
, 8F
11/03 12:29, 8F
→
11/03 12:30,
6年前
, 9F
11/03 12:30, 9F
→
11/03 12:31,
6年前
, 10F
11/03 12:31, 10F
→
11/03 12:32,
6年前
, 11F
11/03 12:32, 11F
→
11/03 12:33,
6年前
, 12F
11/03 12:33, 12F
→
11/03 12:33,
6年前
, 13F
11/03 12:33, 13F
→
11/03 12:35,
6年前
, 14F
11/03 12:35, 14F
→
11/03 12:36,
6年前
, 15F
11/03 12:36, 15F
→
11/03 12:37,
6年前
, 16F
11/03 12:37, 16F
→
11/03 12:38,
6年前
, 17F
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
11/03 19:56, 18F
→
11/03 19:56,
6年前
, 19F
11/03 19:56, 19F
→
11/04 21:16,
6年前
, 20F
11/04 21:16, 20F
→
11/04 21:17,
6年前
, 21F
11/04 21:17, 21F
→
11/04 21:17,
6年前
, 22F
11/04 21:17, 22F
→
11/04 21:18,
6年前
, 23F
11/04 21:18, 23F
→
11/04 21:18,
6年前
, 24F
11/04 21:18, 24F
→
11/04 21:18,
6年前
, 25F
11/04 21:18, 25F
→
11/04 21:19,
6年前
, 26F
11/04 21:19, 26F
→
11/04 21:19,
6年前
, 27F
11/04 21:19, 27F
→
11/04 22:41,
6年前
, 28F
11/04 22:41, 28F