C++ 和生态系统的新手。
我想使用 ioprio_set(2)将进程的 IO 优先级降低到 IOPRIO_CLASS_IDLE
,但我在编译/构建工具链方面遇到了一些问题。我在内核为 3.10.0-229.11.1.el7.x86_64 的 RHEL7 工作站上工作,但这在理想情况下应该适用于任何 Linux 发行版。
我相信我需要 #include <linux/ioprio.h>
关联到 this kernel header .所以我写了这个蹩脚的 hello world:
#include <iostream>
#include <linux/ioprio.h>
using namespace std;
int main() {
cout << "Hello world!" << endl;
syscall(SYS_ioprio_set, IOPRIO_WHO_PROCESS, 0, IOPRIO_PRIO_VALUE(IO_PRIO_CLASS_BE,0));
return 0;
}`
并尝试向 gcc 众神吟唱此法术的一些咒语:
g++ -I/usr/src/kernels/$(uname -r)/include -I/usr/src/kernels/$(uname -r)/arch/x86/include -I/usr/src/kernels/$(uname -r)/include/asm-generic hello_world.cpp
所有这些都以美妙而壮观的方式中断,暗示我可能不应该将它们包含在用户空间代码中。深入挖掘并查看 source of the ionice util-linux 中的实用程序,看起来我正在做一些事情,因为他们或多或少地在 ionice.c
中重新实现了所有这些.
什么是我应该使用的正确方法?我是否应该继续尝试包含该 header ,它不会像所有其他“公共(public)”内核 header 一样安装到/usr/include/linux,或者应该或多或少地将代码移植到我的应用程序拷贝/面食样式中?关于这个 SO post 有一个微妙的暗示, 但如果可能的话,我需要更多的上下文。
谢谢!
最佳答案
您不应该在用户空间中包含来自内核的 header 。 首先,它可能会包含并依赖于您尚未定义的不同内核配置宏,并且代码本身可能不会链接,因为代码可能会引用外部函数。
你有两个选择:
- 您错过了用户空间 header ,如果它可用的话。
- 在您的代码中实现功能,假设有一个系统调用/sysfs/sysctl 可以实现您想要实现的目标。
关于c++ - 在 C++ 中使用来自 linux 内核头文件 ioprio.h 的 ioprio_set(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32542358/