免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2437 | 回复: 4

[驱动] 应用层的printf与驱动的printk的先后顺序 [复制链接]

论坛徽章:
0
发表于 2014-04-25 15:17 |显示全部楼层
驱动是这样的:
  1. static ssize_t overload_write(struct file *filp, const char __user *buf, size_t count, loff_t *offp)
  2. {
  3.     unsigned char ary[100] = "";
  4.     unsigned long len = min(count, sizeof(ary));    //min是个宏,用来获取两个数中较小的值
  5.     int retval;

  6.     dem_dbg("[kern func]: %s  major: %d  minor: %d\n",
  7.                     __FUNCTION__, imajor(filp->f_dentry->d_inode),
  8.                     iminor(filp->f_dentry->d_inode));
  9.      
  10.     if(copy_from_user(ary, buf, len) != 0){
  11.         retval = -EFAULT;
  12.         goto cp_err;
  13.     }

  14.     printk("[msg]: writing context: %s\n",ary);

  15.     return len;    //成功返回实际传输的字节数
  16. cp_err:
  17.     return retval;   
  18. }

  19. static ssize_t overload_read (struct file *filp, char __user *buf, size_t count, loff_t *offp)
  20. {
  21.     unsigned char ary[100] = "you are reading successfully!";
  22.     unsigned long len = min(count, sizeof(ary));    //min是个宏,用来获取两个数中较小的值
  23.     int retval;

  24.     dem_dbg("[kern func]: %s  major: %d  minor: %d\n",
  25.                     __FUNCTION__, imajor(filp->f_dentry->d_inode),
  26.                     iminor(filp->f_dentry->d_inode));

  27.     if(copy_to_user(buf, ary, len) != 0){
  28.         retval = -EFAULT;
  29.         goto cp_err;
  30.     }

  31.     return len;    //成功返回实际传输的字节数
  32. cp_err:
  33.     return retval;   
  34. }
复制代码
应用层是这样的:
  1. //成功返回实际写入字节数,失败返回负值
  2.     retval = write(fd1, buf1, strlen(buf1)+1);
  3.     if(retval < 0){
  4.         perror("writing fd1 failed!");
  5.         goto out;
  6.     }
  7.     printf("<user space>: write bytes: %d   write content: %s\n", retval, buf1);

  8.     //成功返回实际读取字节数,失败返回负值
  9.     retval = read(fd1, buf2, sizeof(buf2));
  10.     if(retval < 0){
  11.         perror("reading fd1 failed!");
  12.         goto out;
  13.     }
  14.     printf("<user space>: read bytes: %d   read content: %s\n", retval, buf2);
复制代码
打印出来的是;
  1. [kern func]: overload_write  major: 16  minor: 65793
  2. [msg]: writing context: I am a test program!
  3. [kern func]: overload_read  major: 16  minor: 65793
  4. [msg]: reading is nonblock mode!
  5. <user space>: write bytes: 21   write content: I am a test program!
  6. <user space>: read bytes: 100   read content: you are reading successfully!
复制代码
为什么是驱动的读与写的函数都打印出来了  应用层才打印呢!!!

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
发表于 2014-04-25 18:34 |显示全部楼层
贴代码看的好累,如果把问题用普通话表达一下,要好一点

overload_{read,write}是在哪儿调用了?

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
发表于 2014-04-27 10:24 |显示全部楼层
应用程序是有字符缓冲区的。 你可以在应用程序的printf后加入fflush(stdout).

论坛徽章:
0
发表于 2014-06-25 15:58 |显示全部楼层
回复 2# amarant


    嗯嗯 简单来说
 第一步:驱动的read函数printk一句话
 第二步:应用printf
 第三步:驱动的write函数printk一句话
 第三四:应用printf一句话

 为什么应用的两个printf最后一起打印出来呢 

论坛徽章:
0
发表于 2014-06-25 16:04 |显示全部楼层
回复 3# Tinnal


    貌似还是没有成功
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP