写程序,严禁偷懒
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-05-12
调程序真的不能偷懒、想当然,真的,实实在在的体会到. 做了半年的linux内核编程,前段时间一直在对socket网络通信的内核函数作改动,为了某种科研目的(呵呵,老板一再强调,科研出成果之前,一定不能外泄, ![]() 于是, ![]() socket sys_recv()->sys_recvfrom()->sock_recvmsg()->__sock_recvmsg() fs sys_read()->sock_aio_read()->do_sock_read()->__sock_recvmsg() 可见,可以在__sock_recvmsg()上将其截获.在socket层,数据包为msghdr结构, ![]() ![]()
冯师兄不愧为linux内核高手,一语道破玄机,跟一下测试程序中的字符串指针值,看看是不是在内核真的memcpy在这个地址上的字符数组里了.我开始半信半疑,两个进程在被fork后装载的相同的代码,执行结果不一致,怎么会是用户空间指针问题呢?反正想不出什么解决办法,试一试吧,这一跟踪,吓了我一大跳,这个指针值,进了内核果然会改变,在执行完receive之后,地址发生了偏移,向后移动了正好msg->msg_iovlen的长度.这下我全明白了,复制的数据块内容是从空数据开始的,打印出来的当然为空了.仔细一查,果然,在__sock_recvmsg() -> sock_common_recvmsg() -> tcp_recvmsg() -> skb_copy_datagram_iovec() -> memcpy_toiovec()中,我找到了iov->iov_len -= copy; iov->iov_base = copy; 隐藏的够深…… 聪明反被聪明误啊,本想在表面上,以简单的方式达到目的,结果却忽略了实质,走了更大的弯路.另外一个方面,在调试过程中想当然的认为某某地方100%不会有问题,结果问题却恰恰出在那里. 总结:写程序不能偷懒,不能投机取巧,不能想当然. 还有,感谢冯师兄.
|
||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于写程序,严禁偷懒的所有评论