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以及可能在编号的thread子目录下的类似文件感兴趣.
如果你拥有一个进程,你可以ptrace()它并在那个进程的事物视图中查看,但更多的情况是代理到其他进程的用户空间视图,而不是使用内核对该进程的视图.