C 如何使用模块获取进程id、名称和状态

C 如何使用模块获取进程id、名称和状态,c,linux,module,linux-device-driver,C,Linux,Module,Linux Device Driver,我想使用模块打印进程id、进程名称和进程状态,作为测试,我尝试使用getpid函数打印进程id,但出现以下错误: 函数“printf”的隐式声明 函数“getpid”的隐式声明 如何解决这些错误以及如何打印进程名称和状态 你的问题毫无意义。getpid和其他。。。只能在用户应用程序代码中工作,而不能在内核中工作。内核可能会运行一些模块代码,即使没有任何特定的进程。特别是,当模块加载时,模块初始化会提前发生 我建议在编写模块之前阅读wikipage。坏的内核模块可能会丢失您的所有数据,或者如果不幸

我想使用模块打印进程id、进程名称和进程状态,作为测试,我尝试使用getpid函数打印进程id,但出现以下错误:

函数“printf”的隐式声明

函数“getpid”的隐式声明

如何解决这些错误以及如何打印进程名称和状态


你的问题毫无意义。getpid和其他。。。只能在用户应用程序代码中工作,而不能在内核中工作。内核可能会运行一些模块代码,即使没有任何特定的进程。特别是,当模块加载时,模块初始化会提前发生

我建议在编写模块之前阅读wikipage。坏的内核模块可能会丢失您的所有数据,或者如果不幸运地损坏了您的硬件


您可能希望从内核的调度程序中查询当前任务。请参阅,但在理解更多内容之前,不要编写任何与内核相关的代码。

您的问题毫无意义。getpid和其他。。。只能在用户应用程序代码中工作,而不能在内核中工作。内核可能会运行一些模块代码,即使没有任何特定的进程。特别是,当模块加载时,模块初始化会提前发生

我建议在编写模块之前阅读wikipage。坏的内核模块可能会丢失您的所有数据,或者如果不幸运地损坏了您的硬件


您可能希望从内核的调度程序中查询当前任务。请参阅,但在了解更多内容之前,不要编写任何与内核相关的代码。

以非常基本的方式回答您的问题:一些内核函数,包括init和exit,代表用户空间进程执行。也就是说,当您使用insmod插入模块时,将执行init函数;当您使用rmmod删除模块时,将执行exit函数。因此,我们可以说函数init是代表insmod进程执行的。exit和rmmod的情况也是如此

现在的问题是找到这个特定函数的相关过程。这可以通过使用当前宏简单地实现。宏的类型为struct task\u struct。需要注意的是,在Linux内部,每个进程的任务控制块或PCB由struct task_struct表示。此数据结构包含与进程相对应的所有信息,如状态、名称、MM信息等。我建议您检查一次数据结构。

当一个特定函数代表一个进程(比如init)执行时,内核将当前宏与该进程的task_结构相关联。因此,通过简单地访问struct task_struct的各个字段,我们可以获得与此函数相关的进程信息

所以,在你的情况下,可能是这样的:

当前->通信:给出进程的名称

当前->pid:给出流程的pid


希望这有帮助。

以一种非常基本的方式回答您的问题:一些内核函数,包括init和exit,代表用户空间进程执行。也就是说,当您使用insmod插入模块时,将执行init函数;当您使用rmmod删除模块时,将执行exit函数。因此,我们可以说函数init是代表insmod进程执行的。exit和rmmod的情况也是如此

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h> //task_pid_nr

/* This function is called when the module is loaded. */
int simple_init(void)
{
       printk(KERN_INFO "Loading Module\n");
       printk("The process id is %d\n", (int) task_pid_nr(current));
       printk("The process vid is %d\n", (int) task_pid_vnr(current));
       printk("The process name is %s\n", current->comm);
       printk("The process tty is %d\n", current->signal->tty);
       printk("The process group is %d\n", (int) task_tgid_nr(current));
       printk("\n\n");
   //return -1; //debug mode of working
   return 0;
}

/* This function is called when the module is removed. */
void simple_exit(void) {
    printk(KERN_INFO "Removing Module\n");
}

/* Macros for registering module entry and exit points. */
module_init( simple_init );
module_exit( simple_exit );

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Simple Module");
MODULE_AUTHOR("SGG");
现在的问题是找到这个特定函数的相关过程。这可以通过使用当前宏简单地实现。宏的类型为struct task\u struct。需要注意的是,在Linux内部,每个进程的任务控制块或PCB由struct task_struct表示。此数据结构包含与进程相对应的所有信息,如状态、名称、MM信息等。我建议您检查一次数据结构。

当一个特定函数代表一个进程(比如init)执行时,内核将当前宏与该进程的task_结构相关联。因此,通过简单地访问struct task_struct的各个字段,我们可以获得与此函数相关的进程信息

所以,在你的情况下,可能是这样的:

当前->通信:给出进程的名称

当前->pid:给出流程的pid


希望这有帮助。

如果您对Linux应用程序级编程不够熟悉,为什么需要编写内核模块?@BasileStarynkevitch阅读了哪些文档?我正在读,但它似乎很有理论性,能有一本带有一些实用代码示例的书吗?@牧民:我无法理解你对理论的评论。我建议先读书。稍后阅读并。。。一般来说,您应该避免内核编程。经过一个月的阅读,在@rasdman的帮助下,学习源代码几个月的非常实际的工作:在不了解发生了什么的情况下编写内核模块是没有意义的。否则,您将破坏您的Linux系统。那么,你真的
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h> //task_pid_nr

/* This function is called when the module is loaded. */
int simple_init(void)
{
       printk(KERN_INFO "Loading Module\n");
       printk("The process id is %d\n", (int) task_pid_nr(current));
       printk("The process vid is %d\n", (int) task_pid_vnr(current));
       printk("The process name is %s\n", current->comm);
       printk("The process tty is %d\n", current->signal->tty);
       printk("The process group is %d\n", (int) task_tgid_nr(current));
       printk("\n\n");
   //return -1; //debug mode of working
   return 0;
}

/* This function is called when the module is removed. */
void simple_exit(void) {
    printk(KERN_INFO "Removing Module\n");
}

/* Macros for registering module entry and exit points. */
module_init( simple_init );
module_exit( simple_exit );

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Simple Module");
MODULE_AUTHOR("SGG");

在尝试编写第一个内核模块之前,您需要几个月的工作,主要是阅读书籍和现有的源代码。@rastman:如果您在内核模块中为某些硬件编写驱动程序,您可能会因内核错误而损坏硬件。因此,请花更多的时间阅读文档。如果您对Linux应用程序级编程不够熟悉,为什么需要编写内核模块?@BasileStarynkevitch阅读哪些文档?我正在读,但它似乎很有理论性,能有一本带有一些实用代码示例的书吗?@牧民:我无法理解你对理论的评论。我建议先读书。稍后阅读并。。。一般来说,您应该避免内核编程。经过一个月的阅读,在@rasdman的帮助下,学习源代码几个月的非常实际的工作:在不了解发生了什么的情况下编写内核模块是没有意义的。否则,您将破坏您的Linux系统。因此,在尝试编写第一个内核模块之前,您确实需要几个月的工作,主要是阅读书籍和现有的源代码。@rastman:如果您在内核模块中为某些硬件编写驱动程序,您可能会因内核错误而损坏硬件。因此,请花更多的时间阅读文档