在非阻塞模式上怎么知道recv接收数据完成?
以linux下 tcp socket编程为例:阻塞就是 recv/read的时候 socket接收缓冲区要是有数据就读, 没数据我就一直睡觉赖着不走,直到有数据来了读完我才走。
send/write的时候,要是发送缓冲区满了,没有空间继续发送了我也一直睡觉赖着不走,直到发送缓冲区腾出足够的空间让我把数据全部塞到发送缓冲区里我才走。
(当然如果你通过setsockopt设置了读写超时,超时时间到了还是会返回-1和EAGAIN,不再睡觉等待)
非阻塞就是recv/read的时候,要是接收缓冲区有数据我就读完,没有数据我直接带着返回的-1和EGAIN走人,绝不睡觉等待耽误时间。
write/send的时候, 要是发送缓冲区有足够的空间,就立刻把数据塞到发送缓冲区去,然后走人,如果发送缓存区满了,空间不足,那直接带着返回的-1和EAGAIN走人。至于IO多路复用,首先要理解的是,操作系统为你提供了一个功能,当你的某个socket接收缓存区有数据可读,或者发送缓冲区有空间可写的时候,它可以给你一个通知。
这样当配合非阻塞的socket使用时,只有当系统通知我哪个描述符可读了,我才去执行read操作,可以保证每次read都能读到有效数据而不做纯返回-1和EAGAIN的无用功。
写操作类似。
操作系统的这个功能通过select/poll/epoll之类的系统调用函数来使用,这些函数都可以同时监视多个描述符的读写就绪状况,这样,多个描述符的I/O操作都能在一个线程内完成,这就叫I/O多路复用,这里的“复用”指的是复用同一个线程。至于事件驱动,其实是I/O多路复用的一个另外的称呼。至于异步同步,我们常见的linux下的网络编程模型大部分都是同步io,以读操作为例,本质上都是需要用户调用read/recv去从内核缓冲区把数据读完再处理业务逻辑。
异步io则是内核已经把数据读好了,用户直接处理逻辑。
异步IO在linux下一般是用aio库。
从前台Web开发转Linux后台编程,该如何下手?
如果我没理解错,您说的是Web应用的后端开发,一般这种情况,主要是后端语言和数据库开发。
网站的后端开发,主要涉及到的是JAVA、PHP、Node.js、Python等语言。数据库有MySQL、PostgreSQL、Oracle、memcached、Redis等等,系统方面主要是对Linux本身的基本知识的学习,之后就是系统优化、维护等。
知道了涉及到哪些要学习的内容,就可以开始选择目标(目标可以是哪种语言更赚钱)。
通用学习步骤:
一、对Linux系统的学习,学会安装开发环境、在这过程中了解到安装、维护、基本命令的使用。
二、在第一步基础上针对语言,进行学习,这一点既然做过前端,应该不是大问题,但要学会开发API(接口)。还有就是对IDE的学习SublimeText、PHPStorm、PyCharm、IDEA等。
三、数据库的学习,一般Web前端不涉及到数据库,一般都是调用后端的接口API,处理JSON数据等,这里主要是针对SQL及Redis、Memecached的学习。
基本就这些了,还有很多内容,就不一一列举了。需要学习的内容很多,希望你能成功!
想转行C/C++ GO Linux后台开发技术栈的可以私信我,C/C++ GO Linux技术栈知识更新不像java那么频繁,那么疲于奔命的去学习。
1. 基础知识
(1)Linux系统命令:Linux系统的命令非常多,是不是所有都要学呢?大家可以先掌握常用的命令,比如ls、pwd、cd、grep、find等常用的命令是必须掌握的;
(2)Linux系统编程:多线程、多进程、锁、消息队列、管道等等知识;
(3)Linux网络编程:udp编程、tcp编程,select、poll、epoll等的使用;
2. 进阶知识
(1)Linux后台开发必备命令:比如怎么用lsof查看端口号,top怎么分析进程和内存、tail怎么读取日志,mpstat怎么分析CPU占有率等等;
(2)Linux系统编程:多线程和多进程的区别在哪里,他们有什么适用场景;redis为什么用单线程模式,为什么又从redis 6.0开始支持多线程;nginx为什么又选用了多进程模式等等;
(3)Linux网络编程:udp和tcp的适用场景是怎么样的;select、poll、epoll三者有什么区别,阻塞和非阻塞IO哪种更适合高并发场景;
3. 后台开发必备技能
(1)客户端和服务器端协议定制、服务器与服务器端的协议定制;
(2)json、xml、protobuf适用场景、如何在工程上使用;
(3)mysq数据库,如何优化索引,如何分库分表、如何搭建mysql集群;
(4)redis,如何在实际项目中使用redis;
(5)消息队列zeromq;
(6)nginx:负载均衡配置、双虚拟主机等等;
(7)resetful api设计;
(8)等等等等等等的知识。
学习路线适合 大三、大四、研一、研二、研三以及工作1~5年的朋友学习。
更详细的学习路线可以关注我后私信我获取。
学习嵌入式难吗,嵌入式学习路线有哪些?
客观讲 难不难是一个相对的问题,取决于你自己的电子技术硬件水平,C语言编程水平还有你的悟性!
建议首先从简单的51单片机编程学起,买一套合适的开放板,跟着教程一步一步学,把每一句程序都弄懂,不明白的可以百度,到论坛提问等方式解决!单个项目熟悉后可以尝试将多个项目进行综合,例如用按键控制数码管,电机等.你会发现难度会增加,这也是你进步的过程.学完教程以后,可以试着做一件完整的产品,例如可以做一个能定闹钟、调时间,显示农历和阳历日期的时钟,或者是根据超声波探测距离控制电机等.从电路设计到焊接或者pcb设计再焊接,到编程调试,功能实现. 输入输出 控制都有了,你对产品的研发过程基本熟悉了,剩下的就是对新的芯片的应用和新电路的设计了。这个过程就比较漫长。
51单片机熟悉以后,可以学习stm32,过程也类似于51单片机的过程.学海无涯,这是你开始进入真正嵌入式技术的学习.只有坚持才能够达到胜利的彼岸. 嵌入式产品不是用的芯片越高级越好,适合产品的才是最好的.希望大家有所收获.
学嵌入式有细分,包括单片机编程、linux驱动编程、linux应用编程、Android应用编程等方向。首先需要明确往那个方面学习发展。
单片机学习路线
从单片机入门是比较好走的路,学习路线也很明确,从C语言开始打基础,51单片机到ARM内核单片机是最通常的做法,很多前辈都摸索出了不错的方法,网上教程很多。
- C语言多数大学大一时期就会教授,上手较容易,程序语法简单。对嵌入式比较关键的是学好运算符表达的含义尤其是位运算,还有函数封装使用,指针的应用,结构体等用户自定义结构的使用,链表其实在linux或Android平台等使用动态内存分配的场景较好用,ARM核的“低端”芯片中当然也会用,学习数据结构或程序编程思想中有较为重要的地位,实际开发依据需要再学习也可以。
- 51单片机,历史悠久,资料丰富。很多国内厂商会研发自己的51内核单片机,大同小异的操作方式,比较友好的是中文资料众多,厂商提供的绝大多数是中文文档。郭天祥的51教程比较经典,网上可以搜到。从51单片机可以说把单片机家族的多数外设都接触了一遍,是入门极好的途径。
- ARM内核单片机在国内应用场景众多,物联网中广泛使用,代表厂商有NXP,ST,还有Microchip、TI等有着不错DSP处理能力的芯片厂商提供不错的产品。从好入手出发,TI的MSP430系列和ST的M32或M8都是不错的选择,教程众多。这方面的单片机比51的外设和性能丰富了不止一点点
- 不论是51还是ARM内核单片机,一定要实践,看教程再多不如动手敲出来看现象,再思考。买有教程配套的开发板是最合适的,如上图这种开发板大把的。教程的实例可以直接对应开发板的IO引脚,让学习者更方便看实验结果。从现象出发看教程讲解,试着自己改动一些内容,看现象的变化再思考怎么发生的,这样参与感强,容易激励自己继续学下去。
- 一切的一切前提需要先学习C/C++语言,否则程序都无法看懂,别的不用扯~~
linux驱动学习路线
学linux驱动最好有单片机的外设和基本通信协议比如IIC、SPI等基础,需要会用linux操作系统,在系统中能进行linux命令行操作,学会在linux和windows下交叉编译程序,这方面教程网上也有,相比单片机的教程就没有那么多比较系统的了。比较好的收费居多,毕竟难度也要上一个等级,氪金学习能接受的也OK。
- C语言基础同样是需要的,毕竟linux内核也是C写的,看不懂就啥也别说啦... 除了上一标题中提到的C需要掌握的内容,linux中还要继续深究其自带的API,包括文件IO的编程,进程线程的使用,信号量等同步机制的实现等等内容,这些在linux应用编程中同样重要。
- 还有linux下的shell命令常用的需要掌握,方便日后学习的进行。在linux操作系统中虽然也有windows一样的图形界面供使用,但在效率和专业性方面,还是命令行来得快~ 命令行界面稍显枯燥,但学习惯了打起来还是很爽的。
- 说完了操作系统方面的,就要看看linux内核驱动了。通常使用linux内核作为驱动的平台都是相对高端的产品,ARM7及以上等级的SOC中常见,这些芯片里跑linux或者后面说的Android系统进而能处理更加复杂的业务。那怎么把linux系统放进这样的芯片里并能在pc机上的linux操作系统中调试就需要学习了。这部分内容包括内核的编译裁剪与移植,根文件系统制作与挂载,交叉编译环境的搭建等等一众内容,需要极大的耐心去修改,下载到对应开发板再调试。
- SOC中拥有了linux系统就可以进行驱动的进一步学习了。这部分要学习三种字符设备驱动模型,等待队列,内核中断机制,poll&select机制,内核定时器和同步机制,IIC、input子系统等等内容,需要看着内核源码来修改编译,期间会涉及许多单片机知识,所以有基础的看源码也不至于太累而坚持不下去。
- 上面这些事情都一定一定要配合一个开发板来进行,如下图,这个不实操真的白谈。做完基本可以在自己的板子上完成类似单片机的所有操作,还能做出视频播放效果,文件管理功能等,类似一台界面不那么好看的手机了。学习驱动主要在很多做高端产品的公司会需要人来移植系统到自己的平台上进行开发,工程比较复杂,当然待遇也不错。
还有两个学习路线放到下次回答,这次先说到这里啦,谢谢支持(#^.^#)

