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

我想使用自Linux 3.14以来可用的新SCHED_DEADLINE调度策略编写程序。

我开始尝试使用sched_setattr函数的简单程序。

 #include  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-generic。 包含的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 并执行:

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

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

对于比libc提供的更新的Linux标头构建用户空间程序的正确方法是什么?

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

sched_setattr()是一个系统调用,似乎没有一对一的libc包装器。 你可以自己做包装,如下所示:

 #define _GNU_SOURCE #include  #include  #include  #include  #include  #include  #include  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“用户空间中的内核头文件”所发现的注释,我真的不能建议尝试包含内核头文件。