我想使用新的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提供的那些?
接下来我如何构建上述程序?
答案 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;建议尝试包含内核头文件。