linux kernel / sched.c - find_process_by_pid - 如何从c应用程序代码中使用它

时间:2012-05-09 15:28:46

标签: 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 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

请提供如何解决此问题的建议。

2 个答案:

答案 0 :(得分:7)

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

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

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

如果你拥有一个进程,你可以ptrace()它并在那个进程的事物视图中查看,但更多的是代理到其他进程的用户空间视图,而不是使用内核对该进程的视图。

答案 1 :(得分:1)

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

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

您可能会发现有关该主题的文档(即使有点旧)是kernel - user space interfaces