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
请提出解决这个问题的建议。
最佳答案
不能将用户模式应用程序直接链接到内部内核功能相反,由于安全性和内存模型差异(更不用说一般的设计清洁度)等原因,您被限制在与导出功能交互时,内核应用适当的检查和翻译。
Syscalls是内核函数的一个子集,可以从用户空间代码中调用,但这不是其中之一。
查找有关外部进程的信息的主要接口是/proc文件系统下的PID条目基本上这是由一堆伪文件组成的。其中大部分是文本文件,如果试图读取一个文本文件,内核将收集并提供适当的信息,就像它是实际文件的内容一样您可能对/proc/PID####/sched和编号的线程子目录下的类似文件感兴趣。
如果你拥有一个进程,你可以ptrace()它,并在进程视图中四处查看,但这更多的是代理到另一个进程的用户空间视图,而不是用内核视图处理该进程。