下面我提到了我的小代码,以下是我对它的疑问 -
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;
}
由于概念很清楚仍然缺乏某些东西,请分享您的建议。
答案 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}}