2017-08-15 70 views
0

我想使用新的SCHED_DEADLINE調度策略since Linux 3.14編寫一個程序。針對比libc更新的linux頭文件的構建使用

我從一個簡單的程序開始嘗試使用sched_setattr函數。

#include <sched.h> 

int main(void) 
{ 
    // struct sched_attr attr; 
    // attr.size = sizeof(struct sched_attr); 
    // attr.sched_policy = SCHED_DEADLINE; 
    sched_setattr(0, (void*)0, 0); 

    return 0; 
} 

但是在編譯時,我得到了以下錯誤:

$gcc dead.c 
dead.c: In function ‘main’: 
dead.c:8:2: warning: implicit declaration of function ‘sched_setattr’ [-Wimplicit-function-declaration] 
    sched_setattr(0, (void*)0, 0); 
    ^~~~~~~~~~~~~ 
/tmp/ccGxWxZE.o: In function `main': 
dead.c:(.text+0x19): undefined reference to `sched_setattr' 
collect2: error: ld returned 1 exit status 

我的系統是運行Ubuntu 16.10 Yakkety,內核4.8.0-59泛型。包含的sched.h文件位於/usr/include/sched.h中,由包libc6-dev提供。此頭文件不包含功能sched_setattr和我正在嘗試使用的朋友。

但是,我安裝的內核(和內核頭文件)附帶了一個sched.h頭文件,其中包含我需要的定義。它位於我的系統上的/usr/src/linux-headers-4.8.0-58/include/linux/sched.h

所以我天真地認爲,讓我們只是針對較新的linux頭文件而不是libc6-dev提供的頭文件進行構建。我的程序只能運行在這個或者更新的內核上,但是這很好。

我修改第一行是:#include <linux/sched.h>和執行:

gcc -I/usr/src/linux-headers-$(uname -r)/include -I/usr/src/linux-headers-$(unam -r)/arch/x86/include dead.c 

現在我得到頁錯誤和警告的頁面之後。這似乎沒有辦法。

什麼是正確的方式來建立一個較新的Linux頭的用戶空間程序比那些由libc提供的?

然後我如何構建上面的程序?

回答

2

sched_setattr()是一個系統調用,似乎沒有一對一的libc包裝。你可以做的包裝自己,這樣的事情:

#define _GNU_SOURCE 
#include <stdio.h> 
#include <string.h> 
#include <stdint.h> 
#include <unistd.h> 
#include <linux/sched.h> 
#include <sys/syscall.h> 
#include <sys/types.h> 

struct sched_attr { 
    uint32_t size;    /* Size of this structure */ 
    uint32_t sched_policy;  /* Policy (SCHED_*) */ 
    uint64_t sched_flags;  /* Flags */ 
    int32_t sched_nice;   /* Nice value (SCHED_OTHER, SCHED_BATCH) */ 
    uint32_t sched_priority; /* Static priority (SCHED_FIFO, SCHED_RR) */ 
    /* Remaining fields are for SCHED_DEADLINE */ 
    uint64_t sched_runtime; 
    uint64_t sched_deadline; 
    uint64_t sched_period; 
}; 

static int sched_setattr (pid_t pid, const struct sched_attr *attr, unsigned int flags) 
{ 
    return syscall (SYS_sched_setattr, pid, attr, flags); 
} 

int main (int argc, char *argv[]) 
{ 
    struct sched_attr attr; 
    int res; 

    memset (&attr, 0, sizeof (struct sched_attr)); 
    attr.size = sizeof (struct sched_attr); 

    res = sched_setattr (getpid(), &attr, 0); 
    if (res < 0) { 
     perror ("sched_setattr"); 
     return 1; 
    } 

    return 0; 
} 

在用戶空間谷歌搜索「內核頭文件試圖包括獲得的struct sched_attr定義所需的內核頭文件時,看着報告的錯誤和閱讀中發現的評論「,我真的不能建議僅僅爲此包含內核頭文件。

+0

謝謝你,我自己做系統調用讓我走了。不過,我仍然想回答一般問題。有沒有辦法使用更新的Linux內核頭來做到這一點,而不是像這樣複製代碼? –

+0

對我來說這是一個有點未知的領域,但看着'chrt'源代碼(https://github.com/karelzak/util-linux/blob/master/schedutils/chrt.c),它似乎完全這樣做一樣的方法。 –

相關問題