2015-09-12 72 views
1

對C++和生態系統來說很新穎。在C++中使用linux內核頭文件ioprio.h中的ioprio_set()

我想使用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; 
}` 

,並試圖誦這個咒語的幾個咒語海合會神:

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實用程序,它看起來像我正在做的事情,因爲它們或多或少地重新實現了ionice.c中的所有內容。

什麼是我正確使用的方法?我是否應該繼續試圖包含該頭文件,而不是像所有其他「公共」內核頭文件一樣將頭文件安裝到/ usr/include/linux,或者應該簡單地將代碼移植到我的應用程序副本/麪食類型中?這個SO post有一個微妙的暗示,但如果可能的話,我需要更多的上下文。

謝謝!

回答

1

您不應該在內核中包含用戶空間的頭文件。 首先,它可能會包含並依賴於您尚未定義的不同內核配置宏,並且可能代碼本身不會鏈接,因爲代碼可能引用了外部函數。

你有兩個選擇:

  1. 你錯過了用戶空間的頭,如果可用的使用它。
  2. 在你的代碼中實現這個功能,假設你有一個syscall/sysfs/sysctl來實現你想要的功能。
+0

這不完全正確。否則,libc如何與內核一起工作?有用於導出和內部使用的標題。 – 0andriy

+0

你是對的。作者顯然是指內部人。因此我的答案 – stdcall