wの元utmp
Linuxのログイン情報の取得について調べているときに、w
コマンドの実装について気になった。巡り巡って/var/run/utmp
とgetutent
にたどり着くんだけど、ファイルについてはw
コマンドのman pageに記載があった。
ファイルが特定できたときに、まあ、とりあえずとcat /var/run/utmp
打ったらコンソールが化けました。バイナリやんか...tmuxから打って大変なことになった。
getutxentでログインユーザーの情報をえる
getutent
とgetutxent
があるがドキュメントの通りgetutxent
を使う。
#include <utmpx.h> #include <iostream> int main() { setutxent(); struct utmpx * ut = 0; while((ut = getutxent()) != NULL) { std::cout << ut->ut_user << ", type:" << ut->ut_type << ", session:" << ut->ut_session << ", line:" << ut->ut_line << ", id:" << ut->ut_id << std::endl; } endutxent(); }
ビルドして実行すると以下のように出力される。ut_sessionはなんでか0でした。ログイン中のユーザー名やpidなどが取得できる。
$ ./a.out reboot, type:2, session:0, line:~, id:~~ runlevel, type:1, session:0, line:~, id:~~ ayataka, type:7, session:0, line::0, id: ayataka, type:7, session:0, line:pts/0, id:/0 test, type:7, session:0, line::1, id: test, type:8, session:0, line:pts/4, id:/4 test, type:7, session:0, line:pts/6, id:/6 ayataka, type:7, session:0, line:pts/8, id:/8