linux kernel/sched.c-通过pid查找\u进程\u-如何从c应用程序代码中使用它

linux kernel/sched.c-通过pid查找\u进程\u-如何从c应用程序代码中使用它,c,linux-kernel,C,Linux Kernel,Linux-2.6.35.13 kernel/sched.c有一个函数find_process_by_pid()。 我尝试使用以下代码: int main() { struct task_struct *p; pid_t pid; pid=2130; p = find_process_by_pid(pid); printf("task_struct.state: %s\n", p->state); return 0; } $gcc g

Linux-2.6.35.13 kernel/sched.c有一个函数find_process_by_pid()。 我尝试使用以下代码:

int main()
{
    struct task_struct *p;
    pid_t pid;
    pid=2130; 

    p = find_process_by_pid(pid);

    printf("task_struct.state: %s\n", p->state);
    return 0;
}
$gcc getProcbyId.c-o getProcbyId

获取以下警告和错误信息:

getProcbyId.c: In function 'main':
getProcbyId.c:19:4: warning: assignment makes pointer from integer without a cast
getProcbyId.c:21:37: error: dereferencing pointer to incomplete type
请给出如何解决此问题的建议。

从一般角度看,此错误似乎是由代码中缺少头文件引起的。 函数返回指向结构的指针:
struct task\u struct*
但是,当您访问结构的字段时,编译器需要知道它的定义,因此会出现错误

无论如何,您确定可以从用户空间调用上述函数吗

您可能会发现关于该主题的有用文档(即使有点旧)是

从一般角度来看,错误似乎是由代码中缺少头文件引起的。 函数返回指向结构的指针:
struct task\u struct*
但是,当您访问结构的字段时,编译器需要知道它的定义,因此会出现错误

无论如何,您确定可以从用户空间调用上述函数吗


关于这个主题,您可能会发现一个有用的文档(即使有点旧)是

您不能直接将用户模式应用程序与内部内核功能链接起来。相反,由于安全性和内存模型差异(更不用说总体设计清洁度)等原因,您只能在内核应用适当检查和转换的情况下与导出的功能进行交互

系统调用是可从用户空间代码调用的内核函数的一个很小的子集,而这不是其中之一

查找外部进程信息的主要接口是/proc文件系统下的PID条目。本质上,它由一堆伪文件组成。其中大多数都是文本文件,尝试读取一个会导致内核收集并提供适当的信息,就像它是实际文件的内容一样。您可能对/proc/PID####/sched以及编号线程子目录下的类似文件感兴趣


如果您拥有一个进程,您可以ptrace()它,并在该进程视图中四处查看,但这更多的是代理到另一个进程的用户空间视图,而不是在内核的进程视图中执行很多操作。

您不能直接将用户模式应用程序与内部内核功能链接起来。相反,由于安全性和内存模型差异(更不用说总体设计清洁度)等原因,您只能在内核应用适当检查和转换的情况下与导出的功能进行交互

系统调用是可从用户空间代码调用的内核函数的一个很小的子集,而这不是其中之一

查找外部进程信息的主要接口是/proc文件系统下的PID条目。本质上,它由一堆伪文件组成。其中大多数都是文本文件,尝试读取一个会导致内核收集并提供适当的信息,就像它是实际文件的内容一样。您可能对/proc/PID####/sched以及编号线程子目录下的类似文件感兴趣


如果您拥有一个进程,您可以ptrace()它,并在该进程的视图中四处查看,但这更多的是代理到另一个进程的用户空间视图,而不是在内核的该进程视图中执行很多操作。

谢谢您的回答。有没有一种简单的方法可以使用c代码从用户空间获取PID的任务结构?@user1042891:我不知道有什么方法可以从用户空间获取信息。您想实现什么?这是出于好奇,一个进程id的任务结构是如何填充的,以便进一步调查。谢谢您的回答。有没有一种简单的方法可以使用c代码从用户空间获取PID的任务结构?@user1042891:我不知道有什么方法可以从用户空间获取信息。您想要实现什么?这是出于好奇,一个进程id的任务结构是如何填充的,以便进一步研究。