在我的程序中使用 for_each_process() 阻止我编译,编译器说需要分号?

Ben*_*Ben 4 c++ process-management linux-kernel

我正在尝试为一个类编写一段非常简单的代码,但我只是不明白为什么我不能编译它。对不起,如果这是一个重复或愚蠢的问题,但我找不到任何其他人为我回答了这个问题。我的完整程序粘贴在下面。当我尝试编译时,出现以下错误:

test.c:在函数“main”中:

test.c:7:27: 错误: 预期 ';' 在“{”标记之前

这是代码:

#include<stdio.h>
#include<linux/sched.h>
#include<linux/kernel.h>

int main(){
    struct task_struct *task;
    for_each_process(task){
        printf("I found task: %d\n", task->pid);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我觉得我错过了一些非常明显的东西,有人能指出这里的问题吗?我尝试将“任务”对象初始化为 NULL 并使用一个更简单的 printf 语句来打印“测试”,但我尝试过的任何内容都无法修复此编译错误。

Guo*_*uai 7

该宏已<linux/sched/signal.h>在 2017 年的此提交中移至 c3edc4010e9d102eb7b8f17d15c2ebc425fed63c。(https://github.com/torvalds/linux/commit/c3edc4010e9d102eb7b8f17d15c2eb6c)。

(对于因此而在编译时遇到问题的人。)


Yak*_*ont 1

您正在使用的预处理器标记for_each_process要么未定义,要么未定义为执行您认为它执行的操作。

我使用过的每个 C++ 编译器都可以被告知转储后预处理输出。如果您在构建源文件时传递使这种情况发生的标志,您将看到编译器正在看到并搞砸的代码。

gcc -E clang -E或者/E例如 Visual Studio 中的标志(呵呵)。

正如@Ulrich 上面提到的,显然该宏仅在内核中可用。尝试直接读取<linux/sched.h>并确定这一点具有挑战性,因为有很多很多 ifdef/endif 对。