|
发表于 2007-6-9 16:09:36
|
显示全部楼层
应该可以不用包含<linux/pid.h>这个头文件,我写了一个,没有问题,你看看.是用/proc这个模块来写的.
- #include<linux/kernel.h>
- #include<linux/module.h>
- #include<linux/proc_fs.h>
- #include<linux/init.h>
- #include<linux/sched.h>
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("scutan");
- static int find_read(char *buffer, char **buffer_location, off_t offset, int count, int *eof, void *data)
- {
- struct task_struct *p;
- int pid;
- pid = current->pid;
- p = find_task_by_pid(pid);
- sprintf(buffer, "%d\t%s\n", p->pid, p->comm);
- return strlen(buffer);
- }
- static int __init find_init(void)
- {
- struct proc_dir_entry *entry;
- entry = create_proc_entry("findpid", 0644, NULL);
- if (entry == 0)
- {
- printk(KERN_ERR "creat_proc_entry failed\n");
- return -1;
- }
- entry->mode = S_IFREG | S_IRUGO;
- entry->size = 100;
- entry->owner = THIS_MODULE;
- entry->uid = 0;
- entry->gid = 0;
- entry->read_proc = find_read;
- return 0;
- }
- void __exit find_exit(void)
- {
- remove_proc_entry("findpid", &proc_root);
- }
- module_init(find_init);
- module_exit(find_exit);
复制代码
Makefile
- obj-m:=find.o
- KERNELDIR:=/usr/src/linux
- default:
- make -C $(KERNELDIR) M=$(shell pwd) modules
- install:
- insmod find.ko
- uninstall:
- rmmod find.ko
- clean:
- rm -rf *.o *.mod.c *.ko
复制代码
另外还有一个测试程序get.c
- #include<stdio.h>
- #include<stdlib.h>
- #include<sys/types.h>
- #include<fcntl.h>
- #include<unistd.h>
- int main()
- {
- int fd;
- char buf[50];
- fd = open("/proc/findpid", O_RDONLY);
- if (fd < 0)
- {
- printf("error\n");
- exit(1);
- }
- memset(buf, 0, sizeof(buf));
- if (read(fd, buf, 50) < 0)
- {
- printf("read error\n");
- exit(1);
- }
- printf("buf = %s\n", buf);
- printf("getpid = %d\n", getpid());
- return 0;
- }
复制代码
编译之后,就可以看到效果. |
|