2017-08-15 42 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),它似乎完全这样做一样的方法。 –

相关问题