使用比libc更新的linux头文件构建

时间:2017-08-15 12:17:37

标签: c linux system-calls libc sched-deadline

我想使用新的SCHED_DEADLINE调度政策since Linux 3.14编写程序。

我从一个简单的程序开始尝试使用#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

但是在编译时我收到以下错误:

sched.h

我的系统正在运行Ubuntu 16.10 Yakkety,内核4.8.0-59-generic。包含的/usr/include/sched.h文件位于libc6-dev中,由包sched_setattr提供。此头文件不包含我正在尝试使用的函数sched.h和朋友。

然而,我安装的内核(和内核头文件)带有一个包含我需要的定义的/usr/src/linux-headers-4.8.0-58/include/linux/sched.h头文件。它位于#include <linux/sched.h>,位于我的系统上。

所以我天真地认为让我们只针对较新的linux头文件而不是libc6-dev提供的头文件。我的程序只能在这个或更新的内核上运行,但这很好。

我将第一行修改为:gcc -I/usr/src/linux-headers-$(uname -r)/include -I/usr/src/linux-headers-$(unam -r)/arch/x86/include dead.c 并执行:

function displayChart(){
    var thePlayer = GetPlayer();
    var var1 = thePlayer.GetVar("variable1");
    var var2 = thePlayer.GetVar("variable2");
    ...

    var myPersoonlijkheid = {
        "Categorie1": var1,
        "Categorie2": var2,
        "Categorie3": var3,
        "Categorie4": var4,
        "Categorie5": var5
    }
   pieChart(myPersoonlijkheid);
}

现在我逐页收到错误和警告。这似乎不太可行。

针对较新的Linux标头构建用户空间程序的正确方法是什么?而不是libc提供的那些?

接下来我如何构建上述程序?

1 个答案:

答案 0 :(得分: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定义所需的内核头文件时所报告的错误,并阅读Googling&#34;用户空间中的内核头文件&#34;找到的注释,我真的可以&# 39;建议尝试包含内核头文件。