在c++中使用来自linux内核头ioprio_h的ioprio_set()
Using ioprio_set() from linux kernel header ioprio.h in C++
对于c++和生态系统来说都是全新的。
我想使用ioprio_set(2)将进程的IO优先级降低到IOPRIO_CLASS_IDLE
,但我在编译/构建工具链方面遇到了一些问题。我在一个内核为3.10.0-229.11.1.el7的RHEL7工作站上。x86_64,但理想情况下,这应该适用于任何Linux发行版。
我认为我需要#include <linux/ioprio.h>
关联到这个内核头。所以我写了这个蹩脚的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
它们都以奇妙而壮观的方式中断,暗示我可能不应该将它们包含在用户空间代码中。在util-linux中深入挖掘并查看ionice实用程序的源代码,看起来我发现了一些东西,因为他们在ionice.c
中或多或少地重新实现了所有这些。
我应该使用什么方法?我应该继续努力包括头,它不会被安装到/usr/include/linux像所有其他"公共"内核头,或者应该简单地或多或少地移植代码到我的应用程序复制/面糊风格?在这篇文章中有一个微妙的暗示,但如果可能的话,我需要更多的背景。
谢谢!
不应该在用户空间中包含内核的头文件。首先,它可能包含并依赖于您尚未定义的不同内核配置宏,而且代码本身可能不会链接,因为代码可能引用外部函数。
你有两个选择:
- 您错过了用户空间标头,如果它可用,请使用它。
- 在你的代码中实现这个功能,假设有一个syscall/sysfs/sysctl来实现你想要实现的功能。
- 为什么我无法更改"set<set>"循环中的值<int>
- 对于set上的循环-获取next元素迭代器
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 如何使用set实现无序数据结构?
- 使用运算符调用 void 函数时出错<set>
- 修改"std::set"中用户定义类型的值
- 生成提升::hana::set 的常量表达式问题
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- set::find 查找不存在的元素
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 将 std:set<int32_t> 复制到 std::set <uint32_t>的好方法
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- google test PrintTo for std::set<std::string>