2017-08-15 7 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 

私のシステムでは、カーネル4.8.0-59-総称で、Ubuntuの16.10 Yakketyを実行しています。 sched.hファイルは/usr/include/sched.hにあり、libc6-devパッケージで提供されています。このヘッダファイルには、使用しようとしている関数sched_setattrと友人が含まれていません。

私がインストールしたカーネル(およびカーネルヘッダー)には、必要な定義を含むsched.hヘッダーファイルが付属しています。私のシステムでは/usr/src/linux-headers-4.8.0-58/include/linux/sched.hにあります。

私は、libc6-devが提供するヘッダではなく、新しいlinuxヘッダを使ってビルドすることができます。私のプログラムは、このカーネルまたはそれより新しいカーネルでのみ実行されますが、それは問題ありません。

私がすべき最初の行変更:#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 

は今、私は、エラーや警告のページの後のページを取得しています。これは行く方法ではありません。

libcで提供されているよりも新しいLinuxヘッダーに対してユーザースペースプログラムを構築する正しい方法は何ですか?

その後、私はどのように上記のプログラムをビルドしますか?

答えて

2

sched_setattr()はシステムコールで、1対1のlibcラッパーはないようです。

struct sched_attrの定義を手に入れるために必要なカーネルヘッダファイルをインクルードしようとすると、ユーザ空間で「カーネルヘッダをグーグルで見つかったコメントを読んだ時に報告されたエラーを見ると
#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; 
} 

:あなたは、ラッパーにこのような何かを自分で行うことができ"、私は本当にこれのためだけにカーネルヘッダファイルをインクルードしようと提案することはできません。

+0

これをお寄せいただき、ありがとうございました。しかし、私はまだ一般的な質問の答えが好きです。このようなコードを複製するのではなく、新しいLinuxカーネルヘッダーを使用する方法はありますか? –

+0

これは私にとっては未知の領域ですが、 'chrt'ソースコード(https://github.com/karelzak/util-linux/blob/master/schedutils/chrt.c)を見ると、これはまさにこれを行うようです同じ方法。 –

関連する問題