c++ - 在 C++ 中使用来自 linux 内核头文件 ioprio.h 的 ioprio_set()

标签 c++ linux linux-kernel

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 。 首先,它可能会包含并依赖于您尚未定义的不同内核配置宏,并且代码本身可能不会链接,因为代码可能会引用外部函数。

你有两个选择:

  1. 您错过了用户空间 header ,如果它可用的话。
  2. 在您的代码中实现功能,假设有一个系统调用/sysfs/sysctl 可以实现您想要实现的目标。

关于c++ - 在 C++ 中使用来自 linux 内核头文件 ioprio.h 的 ioprio_set(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32542358/

相关文章:

html - html 字体大小在 QMessageBox 的信息文本中不起作用吗?

php - UTF-8贯穿始终

php - SNMP Php 无响应,在 linux shell 中工作

c++ - 不同类中实现的纯虚函数的继承

C++ 到 MIPS 汇编

c++ - 如何使动态字符串在控制台中使用 UTF-8?

c - 使用 c 对齐 32 位数据的有效方法是什么

c - 使用 .o 文件构建 .ko 文件

c - 从 GNU/Linux 上的用户进程访问 ARM 的内部存储器

linux - 在 Linux 中创建_singlethread_workqueue