下面我提到了我的小代码,以下是我对此的疑问 -
1.我已经打开/usr/src/linux-headers-3.13.0-32/include/linux/sched.h 并且在那里找到了 struct task_struct 的声明,但是当我尝试声明一个实例即变量时main 函数中的 task_struct 包含 sched.h header ,那么它也无法识别 task_struct,为什么? , 为什么会这样
2. 即使我在我的代码中复制了该头文件的完整代码,即我的 .c 文件在主类之外,然后编译器显示错误以包含许多其他头文件,当我没有复制 sched 的代码时这不是问题.h 在我的 .c 文件中
编译器在第一种情况下显示的错误是 - “temp”的存储大小未知
我的代码是(该代码只是一个代表性的 View 来告诉我的问题的概念)
#include<linux/sched.h>
int main(void)
{
struct task_struct temp;
printf("%d",temp.pid);
return 0;
}
由于概念清晰,仍有不足,请分享您的建议。
最佳答案
我的 Linux 系统 (Ubuntu 14.04) 没有让 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
的目的,您可能会得到一个建议,无需使用 struct task_struct
即可实现您的目标。
如果您只想打印当前进程的 PID,这里是不使用 struct task_struct
的方法:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
printf("%lld\n", (long long)getpid());
return 0;
}
关于c - 为什么不在我的代码中添加#include<linux/sched.h>,代码无法识别 task_struct 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38355494/