关于sys_write参数fd的疑问
大家好,最近在跟踪应用程序对系统中各外设发送数据的情况,有一个现象想请教一下;在机器上有两个串口设备,在应用中分别对应描述符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也应该是不一样的吧?
我有点迷糊了,请大家谁了解这块能帮我解释一下吗? 谢谢。 描述符应该是一样的~
你应该需要先判断pid,然后再判断fd,每个进程都有自己的fd集。 回复 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); iii++)
{
printf(" ch[%d]=0x%02x\n", getpid(), PrnFd, iii, *(argv+iii));
}
write(PrnFd, argv, strlen(argv));
close(PrnFd);
结果如下:
你的temp_process赋值了么??
页:
[1]