为什么不在我的代码中添加#include <linux sched.h =“”>,代码无法识别task_struct结构

时间:2016-07-13 15:08:41

标签: c linux struct operating-system kernel

下面我提到了我的小代码,以下是我对它的疑问 -

1.我已经打开/usr/src/linux-headers-3.13.0-32/include/linux/sched.h并且我在那里找到了struct task_struct的声明,但是当我尝试声明一个实例即变量时在main函数中包含sched.h头的task_struct,那么它也无法识别task_struct,为什么? ,为什么会这样 2.即使我在我的代码中复制了该头文件的完整代码,即我的.c文件在主类之外,然后编译器显示错误,包括许多其他头文件,当我没有复制sched代码时这不是问题.h在我的.c文件中

编译器在第一种情况下显示的错误是 - 'temp'的存储大小未知

我的代码是(代码只是表达我的问题概念的代表性视图)

#include<linux/sched.h>
int main(void)
{
    struct task_struct temp;
    printf("%d",temp.pid);
    return 0;
}

由于概念很清楚仍然缺乏某些东西,请分享您的建议。

4 个答案:

答案 0 :(得分:2)

我的Linux系统(Ubuntu 14.04)无法使用<table> <tr> <td> <img src="http://www.w3.org/html/logo/downloads/HTML5_Badge_128.png"> </td> </tr> </table>用户代码:

struct task_struct

第二场比赛($ rgrep 'task_struct' /usr/include /usr/include/linux/hdreg.h:} task_struct_t; /usr/include/linux/capability.h:struct task_struct; )只是该类型的前瞻性声明。没有类型声明中的struct task_struct;,它只是一个前向声明,而在C(和C ++)中,它不可能使用结构的前向声明来创建变量那种这就是您收到{ ... }错误的原因。

如果要创建类型为storage size of ... isn't known的变量,则需要从另一个struct task_struct文件中获取其类型声明,该文件包含.h。您可能必须为此安装包含内核头的包。请参阅Linux发行版有关查找和安装软件包的文档。安装软件包后,您可以使用{ ... }指定gcc -I /usr/.../...的目录名称以查找gcc个文件。

大多数程序(包括所有用户程序,不包括内核本身和排除内核模块)不需要创建类型为.h的变量。如果您在问题中解释了您想要使用struct task_struct的内容,那么您可能会建议您在不使用struct task_struct的情况下实现目标。

如果您只想打印当前流程的PID,可以在没有struct task_struct的情况下执行此操作:

struct task_struct

答案 1 :(得分:2)

Linux内核头文件并非设计为由用户空间程序直接包含。即使您这样做,这并不意味着您的代码可以访问此类标头的所有内容,因为__KERNEL__定义可以防止这种情况发生。 Linux内核仍然试图让用户代码使用内核头文件成为可能,所以有时可以这样做,但你应该坚持在内核代码中使用内核头文件,否则就使用C库。

This文章可能会有所帮助。

答案 2 :(得分:0)

像这样使用它,sched.h是GNU的一部分

您可以这样使用:

#define _GNU_SOURCE
#ifndef __USE_GNU
#define __USE_GNU
#endif
#include <sched.h>

现在您可以使用sched.h

的所有功能

答案 3 :(得分:0)

“ struct task_struct”无疑存在于“ linux / sched.h”内部。我怀疑您是在以错误的方式构建模块,甚至您的表示形式代码似乎也正在以用户空间c编程风格解决问题。 您应该了解Linux代码在各个方面都与用户空间c程序不同,最基本的是它没有常规的“ main”功能作为入口点,而是基于注册的机制。您可以从{ {3}}