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个不同数据源发过来的设备,可以开线程进行处理。(所谓并发)