5

我想在 C 中实现 DEADLINE 调度策略。我知道该功能已经实现,Linux 3.14.10并且我使用的是 Ubuntu 14.04 Linux #### 3.17.0-031700-lowlatency #201410060605 SMP PREEMPT,它应该是最新的。我用 Eclipse 开发程序(以 sudo 启动)。

我已经定义_GNU_SOURCE并包含sched.h了,但我仍然无法使用关键字SCHED_DEADLINE来定义struct sched_attr或使用类似sched_getattr.

#define _GNU_SOURCE
#include <sched.h>

这些关键字和函数都没有在我的/usr/include/文件夹中定义,但我设法在/usr/src/linux-headers-3.17.0-031700/include/. 我试图将此文件夹包含在我的项目的构建选项中,但它似乎会产生链接错误。

我真的不习惯 C 开发(我最初是一名 JS 开发人员),所以如果有人能解释我做错了什么以及如何解决这个问题,那就太好了。

的内容/usr/include/linux/sched.h

#ifndef _LINUX_SCHED_H
#define _LINUX_SCHED_H

/*
 * cloning flags:
 */
#define CSIGNAL     0x000000ff  /* signal mask to be sent at exit */
#define CLONE_VM    0x00000100  /* set if VM shared between processes */
#define CLONE_FS    0x00000200  /* set if fs info shared between processes */
#define CLONE_FILES 0x00000400  /* set if open files shared between processes */
#define CLONE_SIGHAND   0x00000800  /* set if signal handlers and blocked signals shared */
#define CLONE_PTRACE    0x00002000  /* set if we want to let tracing continue on the child too */
#define CLONE_VFORK 0x00004000  /* set if the parent wants the child to wake it up on mm_release */
#define CLONE_PARENT    0x00008000  /* set if we want to have the same parent as the cloner */
#define CLONE_THREAD    0x00010000  /* Same thread group? */
#define CLONE_NEWNS 0x00020000  /* New namespace group? */
#define CLONE_SYSVSEM   0x00040000  /* share system V SEM_UNDO semantics */
#define CLONE_SETTLS    0x00080000  /* create a new TLS for the child */
#define CLONE_PARENT_SETTID 0x00100000  /* set the TID in the parent */
#define CLONE_CHILD_CLEARTID    0x00200000  /* clear the TID in the child */
#define CLONE_DETACHED      0x00400000  /* Unused, ignored */
#define CLONE_UNTRACED      0x00800000  /* set if the tracing process can't force CLONE_PTRACE on this clone */
#define CLONE_CHILD_SETTID  0x01000000  /* set the TID in the child */
/* 0x02000000 was previously the unused CLONE_STOPPED (Start in stopped state)
   and is now available for re-use. */
#define CLONE_NEWUTS        0x04000000  /* New utsname group? */
#define CLONE_NEWIPC        0x08000000  /* New ipcs */
#define CLONE_NEWUSER       0x10000000  /* New user namespace */
#define CLONE_NEWPID        0x20000000  /* New pid namespace */
#define CLONE_NEWNET        0x40000000  /* New network namespace */
#define CLONE_IO        0x80000000  /* Clone io context */

/*
 * Scheduling policies
 */
#define SCHED_NORMAL        0
#define SCHED_FIFO      1
#define SCHED_RR        2
#define SCHED_BATCH     3
/* SCHED_ISO: reserved but not implemented yet */
#define SCHED_IDLE      5
/* Can be ORed in to make sure the process is reverted back to SCHED_NORMAL on fork */
#define SCHED_RESET_ON_FORK     0x40000000


#endif /* _LINUX_SCHED_H */

编辑

我想要的文件位于/usr/src/linux-headers-3.17.0-031700/include/文件夹中。无论如何,我尝试使用几种方法将文件夹添加到我的项目中。首先使用-Igcc 的标志,然后使用C_INCLUDE_PATH环境变量。

在这两种方式中,gcc 都在默认位置优先搜索并找到了错误的<sched.h>文件。我尝试使用-nostdinc选项来抑制默认位置,但这更糟糕......我得到了很多错误。

4

3 回答 3

1

我实际上升级到Ubuntu 16.04 LTS了 a并且现在默认定义kernel 4.4.0-21-lowlatency了关键字。SCHED_DEADLINE

问题是struct sched_attr,方法sched_getattr() / sched_setattr()仍然缺失!

经过一番研究(感谢 Google),我发现这篇文章是由内核开发人员发布的。在文档的最后,描述了如何使用截止时间调度策略。他们只是简单地自己定义结构和syscallget/set 方法的用途。

于 2016-04-29T06:54:53.100 回答
0

答案可能取决于分布!此示例基于 Debian 8.4

此外,您会发现在这些情况下有两个有用的工具 - 两者都可以在 debian 的存储库中找到 - ack ( ack-grep ) 和locate ack 将帮助您在所有子目录中找到给定的字符串,并且 locate 将帮助您找到实际文件(updatedb如果它之后)存在于您的系统上。例如,您可以找到从根目录开始的所有文件,例如 sched.hlocate sched.h

首先你应该#include 如果你不拥有这个特定的包含,尝试从存储库下载它,以防你使用 Debian - 这个文件可以在(最好是最新的)libc6-dev中找到(注意开发包将包含用于开发目的的包含和标头)或linux-headers

此外,如果您的编译器找不到linux/sched.h尝试给编译器一个路径提示,在我的情况下是:gcc -I/usr/include(在这种情况下完全没用 - 这是linux中的默认包含目录)

请注意/usr/include/linux/sched.h/usr/include/sched.h可能略有不同

于 2016-04-20T13:05:45.263 回答
0

显然,尽管SCHED_DEADLINE自三年前就成为主线,libc 的包含文件仍然缺少截止日期调度程序的接口(即,sched_setattr()sched_getattr()sched_attr)。这种行为在某种程度上类似于让 libc 包装getttid()syscall的时间。

因此,目前最好的选择是从 GitHub 下载 rt-app并使用libdl接口。

于 2017-01-19T11:04:44.823 回答