2012-05-23 40 views
6

我正在編寫使用sched_setaffinity的代碼,它需要內核2.5.8或更高版本。我一直在試圖找出這些東西是否可行:如何安全地使用新的Linux功能?

  1. 帶有較舊內核的系統可以優雅地進行編譯,也許完全忽略該代碼段​​。
  2. 如果我向某個舊內核發送一個編譯好的二進制文件,它會跳過這個函數或者直接打印一個警告。

我想我的問題是,如何在不破壞整個應用程序的情況下安全地使用新的內核函數?

+4

不要擔心2.5內核系列和之前的任何事情。任何仍在使用這些設備的人都應該被放入精神病院或其他東西:) –

+1

@Nikolai:許多嵌入式Linux設備仍然運行2.4.x. –

+1

我確定他們這樣做。他們還仔細地構建了非常有限的一組用戶級二進制文件,因此目標羣體在這裏不是問題。 –

回答

2

你想讓你的程序鏈接或運行?您可以直接通過glibc syscall()函數調用系統調用,而不需要最新的C庫。很明顯,在沒有支持的早期系統上會失敗(快速測試顯示內核返回-1 == ENOSYS表示未實現的系統調用號碼),因此您需要爲此進行測試。

3

使用dlopen()NULL作爲文件名,和dlsym()您要使用的功能。如果dlsym()成功,則通過返回的函數指針調用該函數。

+2

即使該符號位於libc中,該調用仍然可以通過'ENOSYS'失敗。 –

+0

不必要的複雜。只需使用syscall()。 –

+0

這兩個聽起來像很好的選擇。從我所知道的情況來看,dlopen/dlsym()會檢查函數是否存在。而syscall()只是通過glibc調用li​​nux系統調用的另一種方式。但是,爲什麼系統調用呢?除了添加另一個抽象層之外,這是做什麼的?這個解決方案看起來很有前途,我只是想確保它不會做任何可能不需要的東西。 – wlformyd