LoginSignup
2
1

More than 5 years have passed since last update.

GolangのプロセスをFIFO priorityにセットする

Posted at

センサーのデータを読み取って処理するプロセスをGolangで書いたとします。
たくさんあるプロセスの中で、そのプロセスはあまり後回しにはして欲しくないので、プライオリティをFIFOレベルにセットしたいとします。

Golangのgoroutineはどのスレッドで動作するのかはコントロールすることはできません。なので、goroutineの中からスレッドのプライオリティを設定するシステムコールを呼んでもどういう結果になるか不定です。

なので、最初に自分のプロセスの優先度を設定してから、Golangの実行ファイルをexecするツールを作成しました。

run_fifoprio.c
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <unistd.h>

int run_fifoprio(int fifoprio, char** cmd)
{
    struct sched_param param;

    param.sched_priority = fifoprio;
    if (sched_setscheduler(0, SCHED_FIFO, &param) < 0) {
        perror("sched_setscheduler");
        return -1;
    }
    return execvp(cmd[0], cmd);
}


int main(int argc, char** argv)
{
    if (argc < 3) {
        printf("usage: %s fifo_prio command ... \n", argv[0]);
        return 0;
    }
    return (run_fifoprio(atoi(argv[1]), &argv[2]));
}

使い方

fooというGolangの実行ファイルをFIFO priority 10 で実行する

$ run_fifo_prio 10 foo

制限事項

一般ユーザーの権限ではFIFOプライオリティにセットすることはできないので、root権限で実行する必要があります。

追加情報

root権限以外でGolangのプロセスを動かしたい場合は、run_fifoprio にCAP_SYS_NICEのケーバビリティを与えておけばうまくいきそうです。(ただしARM Linuxでは動作未確認。)

ケーパビリティの設定

sudo setcap cap_sys_nice=ep run_fifoprio

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1