Kernel: pipe_read:fread:解释:读取的实际长度与参数里带有的参数的区别。

@waiting_writers:
number of writers blocked waiting for room
@writers:
number of current writers of this pipe
这个函数有一个大循环做buf的copy_to_user;
如果在311行

  1. 没有writer等着(因为buffer空间不够的原因)写buffer;
  2. 而且此时的ret,也就是读到的个数不为0;
  3. 同时buffer里还没有数据
    就在这个317行 break循环;所以read函数退出,实际是没有错误发生;而且ret值和期望的长度不一致

本例发生的原因是由于writer/ksoftirq thread 抢不到CPU,导致在读的时候没有足够的内容在buffer里

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36428903/article/details/126185527
今日推荐