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

标签 c linux struct operating-system kernel

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

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/

相关文章:

linux - Bash shell 复制隐藏目录中的文件

c - 结构成员访问的性能

c - 二分搜索实现(大多数代码结构问题,又名新手问题)

c - 如何根据每行末尾的值对文件行进行排序

linux - coreadm solaris 命令在 linux 中等效?

linux - 让 R 在库目录中查找文件

c - 指针语法查询

c - 将两个结构传递给 C 中的回调函数的更优雅的方法

c - 用于 RaceCondition 控制的 Pthreads 和 Mutexes

c - printf(my_func ,"My string");