センサーのデータを読み取って処理するプロセスを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, ¶m) < 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