在 C++ 中使用来自 linux 内核 header 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.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
所有这些都以美妙而壮观的方式中断,暗示我可能不应该将它们包含在用户空间代码中。深入挖掘并查看 util-linux 中的 source of the ionice 实用程序,看起来我正在研究某些东西,因为它们或多或少 re-implemented 所有这些都在 ionice.c
中.
我应该使用什么样的正确方法?我是否应该继续努力尝试包含 header,它不会像所有其他 "public" 内核 header 那样安装到 /usr/include/linux,或者应该只是更多或更少的端口代码变成我的应用程序 copy/pasta 风格?在这个 SO post 上有一个微妙的提示,但如果可能的话我需要更多的上下文。
谢谢!
您不应在用户空间中包含来自内核的 header。
首先,它可能会包含并依赖于您尚未定义的不同内核配置宏,并且代码本身可能不会 link,因为代码可能会引用外部函数。
您有两个选择:
- 您错过了用户空间 header,如果可用,请使用它。
- 在您的代码中实现功能,假设有一个 syscall/sysfs/sysctl 可以满足您要实现的目标。
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
所有这些都以美妙而壮观的方式中断,暗示我可能不应该将它们包含在用户空间代码中。深入挖掘并查看 util-linux 中的 source of the ionice 实用程序,看起来我正在研究某些东西,因为它们或多或少 re-implemented 所有这些都在 ionice.c
中.
我应该使用什么样的正确方法?我是否应该继续努力尝试包含 header,它不会像所有其他 "public" 内核 header 那样安装到 /usr/include/linux,或者应该只是更多或更少的端口代码变成我的应用程序 copy/pasta 风格?在这个 SO post 上有一个微妙的提示,但如果可能的话我需要更多的上下文。
谢谢!
您不应在用户空间中包含来自内核的 header。 首先,它可能会包含并依赖于您尚未定义的不同内核配置宏,并且代码本身可能不会 link,因为代码可能会引用外部函数。
您有两个选择:
- 您错过了用户空间 header,如果可用,请使用它。
- 在您的代码中实现功能,假设有一个 syscall/sysfs/sysctl 可以满足您要实现的目标。