1. 尝试strace 或 jstack 去追踪程序,发现某一个进程作为socket连接server出现如下的log(strace追踪):
1. ioctl(45,[0],0) = 0 2. ........ 3. ioctl(45,[12],0) = 12
ioctl作为用户态和内核态的数据交互,按照最简单的方式理解:
ioctl询问内核是否有资源/数据可取,返回len>0则调用系统接口read读取资源/数据,接着处理后续的业务逻辑。
该过程应该很容易理解。
2. 了解ioctl的作用
搜索的一些资料: “ioctl函数里面都实现了多个的对硬件的操作,通过应用层传入的命令来调用相应的操作”。
3. read作为一个阻塞型的接口,在socket接收数据过程中是否有其他影响。
当服务器读取数据,通过read,一旦客户端异常退出,该处read阻塞,导致一直等待下去。
while(1) { int len; len = read(fd,buffer,0); if(len > 0) do_what_do(); }
当客户端发来10段数据:
1. 当while(1)是在一个线程里面跑的部分程序,len>0则处理第一段数据,进入do_what_do,在处理do_what_do过程中是无法继续在read读取数据。
10段数据只能一段一段进行处理。
2. 若对应do_what_do有10个不同数据源发过来的设备,可以开线程进行处理。(所谓并发)
Life is mess, don't let mess mess us.