我正在編寫使用sched_setaffinity的代碼,它需要內核2.5.8或更高版本。我一直在試圖找出這些東西是否可行:如何安全地使用新的Linux功能?
- 帶有較舊內核的系統可以優雅地進行編譯,也許完全忽略該代碼段。
- 如果我向某個舊內核發送一個編譯好的二進制文件,它會跳過這個函數或者直接打印一個警告。
我想我的問題是,如何在不破壞整個應用程序的情況下安全地使用新的內核函數?
我正在編寫使用sched_setaffinity的代碼,它需要內核2.5.8或更高版本。我一直在試圖找出這些東西是否可行:如何安全地使用新的Linux功能?
我想我的問題是,如何在不破壞整個應用程序的情況下安全地使用新的內核函數?
你想讓你的程序鏈接或運行?您可以直接通過glibc syscall()
函數調用系統調用,而不需要最新的C庫。很明顯,在沒有支持的早期系統上會失敗(快速測試顯示內核返回-1 == ENOSYS表示未實現的系統調用號碼),因此您需要爲此進行測試。
使用dlopen()
與NULL
作爲文件名,和dlsym()
您要使用的功能。如果dlsym()
成功,則通過返回的函數指針調用該函數。
即使該符號位於libc中,該調用仍然可以通過'ENOSYS'失敗。 –
不必要的複雜。只需使用syscall()。 –
這兩個聽起來像很好的選擇。從我所知道的情況來看,dlopen/dlsym()會檢查函數是否存在。而syscall()只是通過glibc調用linux系統調用的另一種方式。但是,爲什麼系統調用呢?除了添加另一個抽象層之外,這是做什麼的?這個解決方案看起來很有前途,我只是想確保它不會做任何可能不需要的東西。 – wlformyd
不要擔心2.5內核系列和之前的任何事情。任何仍在使用這些設備的人都應該被放入精神病院或其他東西:) –
@Nikolai:許多嵌入式Linux設備仍然運行2.4.x. –
我確定他們這樣做。他們還仔細地構建了非常有限的一組用戶級二進制文件,因此目標羣體在這裏不是問題。 –