免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3362 | 回复: 1
打印 上一主题 下一主题

[内核入门] 求解linux cat命令的实现机制!cat设备节点文件,没任何输出(之前已写入) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-20 23:16 |只看该作者 |倒序浏览
pipe设备:实现一个循环缓冲区阻塞读写

pipe0为设备节点

应用程序:
int main(int argc, char **argv)
{
int fd;
int err;
char wb[1000] = "today is good day!";
char wb1[1000] = "what's the problem";
char rb[1000] ;
fd = open("/dev/pipe0", O_RDWR);//读写打开设备
if (fd < 0)
{
printf("can't open!\n");
}
printf("fd is : %d\n ",fd);
printf("%s\n", wb);
printf("%s\n", wb1);
   write(fd, &wb, 20);//写二次
  write(fd, &wb1, 20);
   err=read(fd, &rb, 20);//读数据
  printf("err is :%d\n", err);
   printf("%s\n", rb);//打印所读到数据
  
return 0;
}
应用程序Linux下运行结果:
root@book-desktop:/work/pipe# ./pipetest
fd is : 3
  today is good day!
what's the problem
err is :20
today is good day!
root@book-desktop:/work/pipe#
root@book-desktop:/work/pipe#
root@book-desktop:/work/pipe# cat /dev/pipe0

^C
root@book-desktop:/work/pipe#
cat pipe0怎么什么都没有,是无数据还是阻塞,为什么?求大神讲解下cat的机制啊?

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
2 [报告]
发表于 2015-06-25 21:14 |只看该作者
应该跟cat没啥关系,cat的读写肯定都是block io。

可以strace确认一下,是block在open上,还是block在read上。

可以找一下fifo/pipe的实现,依稀记得,它对应的kernel buffer不是固定不变的,好像跟reader/writer的引用计数有关系。

如果你的程序不退出,在return 0之前加个pause,也许就能被外面的cat读到了。【不确定,自己做实验试试吧】
  1. static int fifo_open(struct inode *inode, struct file *filp)
  2. {
  3.         pipe = inode->i_pipe;
  4.         if (!pipe) {
  5.                 pipe = alloc_pipe_info(inode);
  6.                 inode->i_pipe = pipe;
  7.         }
  8.         switch (filp->f_mode) {
  9.         case 3:
  10.         /*
  11.          *  O_RDWR
  12.          *  POSIX.1 leaves this case "undefined" when O_NONBLOCK is set.
  13.          *  This implementation will NEVER block on a O_RDWR open, since
  14.          *  the process can at least talk to itself.
  15.          */
  16.                 filp->f_op = &rdwr_fifo_fops;
  17.                 pipe->readers++;
  18.                 pipe->writers++;
  19. }               
  20. const struct file_operations rdwr_fifo_fops = {
  21.         .release        = pipe_rdwr_release,
  22. };
  23. static int pipe_rdwr_release(struct inode *inode, struct file *filp)
  24. {
  25.         int decr, decw;
  26.         decr = (filp->f_mode & FMODE_READ) != 0;
  27.         decw = (filp->f_mode & FMODE_WRITE) != 0;
  28.         return pipe_release(inode, decr, decw);
  29. }
  30. static int pipe_release(struct inode *inode, int decr, int decw)
  31. {
  32.         pipe->readers -= decr;
  33.         pipe->writers -= decw;
  34.         if (!pipe->readers && !pipe->writers) {
  35.                 free_pipe_info(inode);
  36.         }
  37. }
复制代码

评分

参与人数 1信誉积分 +5 收起 理由
d82616520 + 5 赞一个!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP