免费注册 查看新帖 |

Chinaunix

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

[文件系统] 关于sys_write参数fd的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-07 11:51 |只看该作者 |倒序浏览
         大家好,最近在跟踪应用程序对系统中各外设发送数据的情况,有一个现象想请教一下;
         在机器上有两个串口设备,在应用中分别对应描述符3和4,我想在sys_write函数中,对发送给这两个设备的数据进行分类,现在用的方法是利用fd的值来区分,
asmlinkage ssize_t sys_write(unsigned int fd, const char __user * buf, size_t count)
{
       if(3 == fd)    //在函数中添加条件检索,并把符合条件的信息记录到文件中,
      {
               ......
      }

      
}

但是我发现,记录文件的内容,与应用发给设备的信息不一样(以十六进制方式比较),文件中的内容很多,我感觉是把所有的write都记录了,而且应用发送的信息在文件中找不到,我查了一下,发现sys_write函数中,是用以下方式处理描述符的,
        file = fget_light(fd, &fput_needed);
        if (file) {
                loff_t pos = file_pos_read(file);
                ret = vfs_write(file, buf, count, &pos);

但是也是根据fd来进行转换的呀,不同的fd对应的file也应该是不一样的吧?
我有点迷糊了,请大家谁了解这块能帮我解释一下吗? 谢谢。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
2 [报告]
发表于 2014-07-07 12:08 |只看该作者
描述符应该是一样的~

你应该需要先判断pid,然后再判断fd,每个进程都有自己的fd集。

论坛徽章:
0
3 [报告]
发表于 2014-07-07 16:42 |只看该作者
回复 2# humjb_1983

你好,
按你的办法,首先,我想在驱动和应用两者间,把用到write操作的进程的ID做个比较,但是我发现两者没有相同的ID值。比较的代码如下,请问这样做的思路是否正确,谢谢。

模块:
   struct task_struct temp_process;

        if(1)
        {
                printk( KERN_INFO"/********************fd=%d\n",         temp_process.pid );                       
//                int iii;
//                for(iii=0; iii<count; iii++)
//                        printk(KERN_INFO "p_buf[%d]=0x%02x\n", fd, *(p_buf+iii));
//                _record_ttyfile(buf, TTYNAME, temp_process.pid);
//                test_netlink(buf);
        }

应用:
          int iii;
        for(iii=0; iii<strlen(argv[1]); iii++)
        {
                printf("[PID=%d][FD=%d] ch[%d]=0x%02x\n", getpid(), PrnFd, iii, *(argv[1]+iii));
        }

        write(PrnFd, argv[1], strlen(argv[1]));
        close(PrnFd);  

结果如下:

QQ图片20140707163950.jpg (50.61 KB, 下载次数: 35)

QQ图片20140707163950.jpg

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
4 [报告]
发表于 2014-07-08 14:12 |只看该作者
你的temp_process赋值了么??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP