LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3251|回复: 8

help!关于 find_task_by_pid.

[复制链接]
发表于 2007-6-9 01:27:17 | 显示全部楼层 |阅读模式
我在代码使用struct  task_struct  *find_task_by_pid(int pid),
并添加了#include<linux/sched.h>,
为何编译时总有error :‘find_task_by_pid’ was not declared in this scope . ?
谢谢!

另外:  kernel version:2.6.18 (fedora  5).
发表于 2007-6-9 12:15:05 | 显示全部楼层
什么代码?内核模块?
回复 支持 反对

使用道具 举报

发表于 2007-6-9 13:16:06 | 显示全部楼层
Post by puma1800
我在代码使用struct  task_struct  *find_task_by_pid(int pid),
并添加了#include<linux/sched.h>,
为何编译时总有error :‘find_task_by_pid’ was not declared in this scope . ?
谢谢!

另外:  kernel version:2.6.18 (fedora  5).
find_task_by_pid是个宏, 不知你还包含了<linux/pid.h>这个头文件没有?

最好能看一下代码.
回复 支持 反对

使用道具 举报

发表于 2007-6-9 16:09:36 | 显示全部楼层
应该可以不用包含<linux/pid.h>这个头文件,我写了一个,没有问题,你看看.是用/proc这个模块来写的.

  1. #include<linux/kernel.h>
  2. #include<linux/module.h>
  3. #include<linux/proc_fs.h>
  4. #include<linux/init.h>
  5. #include<linux/sched.h>

  6. MODULE_LICENSE("GPL");
  7. MODULE_AUTHOR("scutan");

  8. static int find_read(char *buffer, char **buffer_location, off_t offset, int count, int *eof, void *data)
  9. {
  10.         struct task_struct *p;
  11.         int pid;
  12.         pid = current->pid;
  13.         p = find_task_by_pid(pid);
  14.         sprintf(buffer, "%d\t%s\n", p->pid, p->comm);
  15.         return strlen(buffer);
  16. }

  17. static int __init find_init(void)
  18. {
  19.         struct proc_dir_entry *entry;
  20.         entry = create_proc_entry("findpid", 0644, NULL);
  21.         if (entry == 0)
  22.         {
  23.                 printk(KERN_ERR "creat_proc_entry failed\n");
  24.                 return -1;
  25.         }
  26.         entry->mode = S_IFREG | S_IRUGO;
  27.         entry->size = 100;
  28.         entry->owner = THIS_MODULE;
  29.         entry->uid = 0;
  30.         entry->gid = 0;
  31.         entry->read_proc = find_read;
  32.         return 0;
  33. }

  34. void __exit find_exit(void)
  35. {
  36.         remove_proc_entry("findpid", &proc_root);
  37. }

  38. module_init(find_init);
  39. module_exit(find_exit);
复制代码


Makefile

  1. obj-m:=find.o
  2. KERNELDIR:=/usr/src/linux

  3. default:
  4.         make -C $(KERNELDIR) M=$(shell pwd) modules
  5. install:
  6.         insmod find.ko
  7. uninstall:
  8.         rmmod find.ko
  9. clean:
  10.         rm -rf *.o *.mod.c *.ko
复制代码


另外还有一个测试程序get.c

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<sys/types.h>
  4. #include<fcntl.h>
  5. #include<unistd.h>

  6. int main()
  7. {
  8.         int fd;
  9.         char buf[50];
  10.         fd = open("/proc/findpid", O_RDONLY);
  11.         if (fd < 0)
  12.         {
  13.                 printf("error\n");
  14.                 exit(1);
  15.         }
  16.         memset(buf, 0, sizeof(buf));
  17.         if (read(fd, buf, 50) < 0)
  18.         {
  19.                 printf("read error\n");
  20.                 exit(1);
  21.         }
  22.         printf("buf = %s\n", buf);
  23.         printf("getpid = %d\n", getpid());
  24.         return 0;
  25. }
复制代码


编译之后,就可以看到效果.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-10 23:09:54 | 显示全部楼层
Post by scutan
应该可以不用包含<linux/pid.h>这个头文件,我写了一个,没有问题,你看看.是用/proc这个模块来写的.

  1. #include<linux/kernel.h>
  2. #include<linux/module.h>
  3. #include<linux/proc_fs.h>
  4. #include<linux/init.h>
  5. #include<linux/sched.h>

  6. MODULE_LICENSE("GPL");
  7. MODULE_AUTHOR("scutan");

  8. static int find_read(char *buffer, char **buffer_location, off_t offset, int count, int *eof, void *data)
  9. {
  10.         struct task_struct *p;
  11.         int pid;
  12.         pid = current->pid;
  13.         p = find_task_by_pid(pid);
  14.         sprintf(buffer, "%d\t%s\n", p->pid, p->comm);
  15.         return strlen(buffer);
  16. }

  17. static int __init find_init(void)
  18. {
  19.         struct proc_dir_entry *entry;
  20.         entry = create_proc_entry("findpid", 0644, NULL);
  21.         if (entry == 0)
  22.         {
  23.                 printk(KERN_ERR "creat_proc_entry failed\n");
  24.                 return -1;
  25.         }
  26.         entry->mode = S_IFREG | S_IRUGO;
  27.         entry->size = 100;
  28.         entry->owner = THIS_MODULE;
  29.         entry->uid = 0;
  30.         entry->gid = 0;
  31.         entry->read_proc = find_read;
  32.         return 0;
  33. }

  34. void __exit find_exit(void)
  35. {
  36.         remove_proc_entry("findpid", &proc_root);
  37. }

  38. module_init(find_init);
  39. module_exit(find_exit);
复制代码


Makefile

  1. obj-m:=find.o
  2. KERNELDIR:=/usr/src/linux

  3. default:
  4.         make -C $(KERNELDIR) M=$(shell pwd) modules
  5. install:
  6.         insmod find.ko
  7. uninstall:
  8.         rmmod find.ko
  9. clean:
  10.         rm -rf *.o *.mod.c *.ko
复制代码


另外还有一个测试程序get.c

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<sys/types.h>
  4. #include<fcntl.h>
  5. #include<unistd.h>

  6. int main()
  7. {
  8.         int fd;
  9.         char buf[50];
  10.         fd = open("/proc/findpid", O_RDONLY);
  11.         if (fd < 0)
  12.         {
  13.                 printf("error\n");
  14.                 exit(1);
  15.         }
  16.         memset(buf, 0, sizeof(buf));
  17.         if (read(fd, buf, 50) < 0)
  18.         {
  19.                 printf("read error\n");
  20.                 exit(1);
  21.         }
  22.         printf("buf = %s\n", buf);
  23.         printf("getpid = %d\n", getpid());
  24.         return 0;
  25. }
复制代码


编译之后,就可以看到效果.




好的. 十分感谢!  我 先试试看.!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-11 01:46:01 | 显示全部楼层
我试了你的代码,头文件没问题,编译正常.
可是当执行insmod find.ko时,却显示insmod: error inserting 'find.ko': -1 Invalid module format.
这可能是哪些方面的原因呢?

我下午重新安装了fedora,此时内核版本是2.6.18,内核代码树的版本是2.6.20. 莫非是这个原因?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-11 02:02:14 | 显示全部楼层
果然,我在insmod  find.ko之后,  于/var/log/messages中发现了如下信息:Jun 11 02:03:29 localhost kernel: find: disagrees about version of symbol struct_module.
~                                                                              
~
回复 支持 反对

使用道具 举报

发表于 2007-6-11 10:20:24 | 显示全部楼层
哦,那应该是你的内核版本不相符的问题,不过汗一个,晚上1,2点还在奋战.强.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-12 00:22:44 | 显示全部楼层
更改了内核代码树的版本后,insmod的问题解决了.
执行./get后也看到了结果.
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表