ACM菜鸟大牛和教主的区别 转自 -> 闲着无聊的博客

本文通过幽默风趣的方式对比了编程领域的菜鸟、大牛和教主在面对编程问题时的不同表现,从解决问题的方法到心态都有所涉及。
对菜鸟来说题目有三种:会算法且能AC的,会算法但不能AC的,不会做的
对大牛来说题目有两种:会做的,不会做的
对教主来说题目有两种:能AC的,数据有错的

菜鸟提交WA了,找了N久找不出错时,在论坛大骂数据有错,但是没人理
大牛提交WA了,找了N久找不出错时,写暴力程序或者求别人的AC程序对拍
教主提交WA了,Judge马上修正数据

菜鸟面对一道难题,直接暴搜
大牛面对一道难题,算了算时间复杂度不对,或者证明出是NP难,果断放弃
教主面对一道难题,说,虽然我不会做,但AC还是没有问题的

菜鸟AC了一道难题,巴不得召告天下
大牛AC了一道难题,会写一篇解题报告,第一句话一定是:这题其实不难
教主AC了一道难题,好像什么都没发生过

菜鸟切OJ,只挑简单题做
大牛切OJ,成套成套地做
教主早就不切OJ了

菜鸟经常在论坛和QQ上求助
大牛经常在论坛和QQ上灌水
教主一般不露面

菜鸟喜欢说自己做了几十几百道题
大牛喜欢说自己把某个OJ做了百分之八九十
教主一般不说话

菜鸟队看到场上90%的队伍挂起了红球,开始找红球是哪道题
大牛队全场第一个挂起黄球,然后发现几乎同时有另外几支大牛队也挂起了黄球
教主队全场第一个挂起绿球,然后全场到最后也只有一个绿球

菜鸟喜欢搜集各种模板
大牛只用自己写的模板
教主不用模板,但他当场写的程序会被别人用作模板

菜鸟喜欢YY这种分析菜鸟、大牛和教主的区别的文章
大牛看完这样的文章会笑一笑,懒得回帖
教主直接无视
`[LJR_ACM] open (efault)` 中的 `(efault)` 并不是一个正常的 TTY 设备名称,而是一种内核中由于 **访问用户空间或无效内存地址失败** 导致的错误表现。具体来说: 你看到 `open (efault)` 的原因是:在调用 `printk` 时尝试打印 `acm->port.tty->name`,但此时 `acm->port.tty` 指向的内存可能尚未正确初始化,或者已经被释放,导致内核在尝试读取 `.name` 字段时发生了错误(类似用户态的段错误),于是 `printk` 或相关字符串处理机制将该非法字符串替换为 `(efault)`。 > 🔴 `(efault)` 是 Linux 内核日志中一个特殊的占位符,表示 `copy_from_user` 或类似访问用户/指针操作时返回 `-EFAULT` 错误 —— 即“无效地址”或“无法访问的内存”。 --- ### 可能原因分析 1. **`acm->port.tty` 不等于当前 `tty`** - 在 `acm_tty_open` 中,你应该使用传入的 `tty` 参数,而不是通过 `acm->port.tty` 去访问。 - 正确做法是:`acm = tty->driver_data;` 后,直接使用 `tty->name` 而非 `acm->port.tty->name`。 2. **`acm->port.tty` 未及时更新** - `tty_port` 结构中的 `tty` 字段是在 `tty_port_open` 等函数中设置的,可能在你调用 `printk` 时尚未建立。 - 因此 `acm->port.tty` 是空指针或野指针,解引用它会导致不可预测行为。 3. **竞态或设备已断开** - 如果 USB ACM 设备已经断开,但打开操作仍被触发,`tty` 结构可能已被释放。 --- ### ✅ 正确的日志写法 ```c static int acm_tty_open(struct tty_struct *tty, struct file *filp) { struct acm *acm = tty->driver_data; printk(KERN_INFO "[LJR_ACM] open %s at: %llu\n", tty->name, ktime_get_ns()); return tty_port_open(&acm->port, tty, filp); } ``` ✅ 使用 `tty->name` 而不是 `acm->port.tty->name`,因为: - `tty` 参数是当前有效的 TTY 实例。 - `acm->port.tty` 只有在端口完全打开后才会被 `tty_port_open` 设置。 --- ### 如何验证? 你可以加一句判断防止崩溃: ```c if (!acm || !tty->name) { printk(KERN_ERR "[LJR_ACM] acm or tty->name is NULL!\n"); return -ENODEV; } ``` --- ### 总结 `(efault)` 表示内核试图打印一个来自无效内存地址的字符串。你的代码中使用了尚未初始化或已失效的 `acm->port.tty->name`,应改为使用可靠的 `tty->name`。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值