- 论坛徽章:
- 3
|
所有的邮件列表看完.
Linus是伟光正的, 但Mauro同学似乎也木有错.
争论是用户程序通过ioctl陷入内核后, 同样的获取资源/搞点什么的操作, Mauro同学打补丁前返回值应该/大约是EINVAL, 但是Mauro同学在某驱动/内核API函数中把这个返回值给改了, 改成了ENOENT.
当然咯: 不同的返回值表示不同的错误. 用户程序通过测试返回值知道发生了什么错误再采取下一步动作.
打个比方... 比如写了个可以根据index往链表中插入节点的API. 由于是链表插入操作, 要为新节点分配内存, 因此malloc有可能失败, 那么如果内存分配失败的话约定返回-1给调用方. 问题是插入节点的API仍可能失败 -- 比如当前链表长度只有5个节点, 但是用户要求将数据插入到第8个节点之前 -- 这时这个API当然不能傻乎乎地就去插入吧, 同样返回个错误给用户才行啊, 于是约定当index错误时返回-2给调用方. 正常操作并成功返回0, 惯例.
-- 这表示, 用户和链表插入API之间有个约定, 这个约定是不能随便破坏的, 否则程序肿木协作啊是不.
所以Mauro童鞋把返回值一改就出问题了, 原来用户程序[似乎pulseaudio? 艹, 说起这daemon我火大, Ubuntu下面root用户进图形界面那声音按钮木反应, 非要自己动点手脚才能正常工作, 你要是自己启动它, 这哥们还提示什么系统模式不安全啥啥啥的... ]工作得好好的啊, 尼玛现在crash了.
Linus一看, 我草好你个Mauro童鞋, 人家用户发邮件问程序崩了肿木回事, 这明显是你个烂人把错误返回码改了闹出来的嘛, 你竟然还去说是用户程序的问题, 草, 于是怒了, 把Mauro童鞋批了一顿: 艹返回值是能随便改滴么, 那是和用户滴约定你知道么, 你打破约定导致用户程序崩了是你滴错知道木,.. blablabla...
Mauro童鞋是内核开发者啊, 尼玛那水平肯定是杠杠的, 我等菜鸟不能比. 连我等菜鸟都熟知的事情, Mauro童鞋会不知道? 当然是不可能滴. 于是Mauro童鞋委屈滴辩解, 是啊, 偶是修改了返回值, 可TMD这返回值确实应该改, 因为尼玛一大堆驱动都是A约定, 可TMD这玩意它不小心整成了B约定, 哥觉得吧, 少数服从多数, 所以这玩意该整成A约定.
...... 嗯, 大抵就是如此了.
|
|