1

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

请给出如何解决这个问题的建议。

4

2 回答 2

7

您不能直接将用户模式应用程序与内部内核功能联系起来。相反,由于安全性和内存模型差异(更不用说一般设计清洁度)等原因,您只能与内核应用适当检查和翻译的导出功能进行交互。

系统调用是内核函数的一小部分,可以从用户空间代码调用,这不是其中之一。

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

如果您拥有一个进程,您可以 ptrace() 它并在该进程视图中查看事物,但这更像是代理到另一个进程的用户空间视图的情况,而不是对内核对该进程的视图做很多事情。

于 2012-05-09T16:11:18.447 回答
1

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

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

您可能会发现对该主题有用的文档(即使有点旧)是内核 - 用户空间接口

于 2012-05-09T15:48:47.950 回答