prctl(2)でプロセスを色々操作できるらしい
http://mkosaki.blog46.fc2.com/blog-entry-946.htmlで知った。
ただし、Linux専用のシステムコール。
親プロセス死亡シグナルを設定できたり、コアダンプ生成のコントロールとか色々便利そうだけど危険な香りが。
名前を設定出来ると有ったのでpsした名前を変えれるのかと試してみた。
$ cat hoge.c #include <stdio.h> #include <string.h> #include <sys/prctl.h> int main(int argc, char **argv) { char name[128]; snprintf(name, sizeof(name), "hogehoge"); prctl(PR_SET_NAME, name, 0l, 0l, 0l); system("ps aux|grep hoge"); memset(name, 0, sizeof(name)); prctl(PR_GET_NAME, name, 0l, 0l, 0l); printf("%s\n", name); return 0; }
$ ./hoge ****** 3042 0.0 0.0 1624 328 pts/3 S+ 23:55 0:00 ./hoge ****** 3043 0.0 0.0 1844 492 pts/3 S+ 23:55 0:00 sh -c ps aux|grep hoge ****** 3045 0.0 0.0 3044 804 pts/3 S+ 23:55 0:00 grep hoge hogehoge
どうもpsして出てくる名前とは違うらしい。
けど名前は設定できるので、内部で持っている情報かな。
実体はkernel/sys.cのsys_prctl()かな。
今回使ったPR_SET_NAMEだとsys_prctl()->set_task_comm()と呼ばれてtsk->commにコピーしているだけ。
当然だけど、PR_GET_NAMEだとtsk->commから持ってくるだけ。
include/linux/sched.h
struct task_struct { //省略 char comm[TASK_COMM_LEN]; /* executable name excluding path */ //省略 }
コメントをインチキ訳すると「実効パスを除いた実行可能な名前(実行名のこと?)」とあるからpsで出てくる名前に関係ありそうだけどよく分からん。
psなんか/procの下を見ているだけだからそっちには反映されないってことかな。
PR_GET_SECCOMPとかmanに無いのもあってよく分からない。
そのうち/proc以下の部分のソースも追おうかな。
しかし何回見てもstruct task_structはでかすぎ。
他のOSの構造体もここまで大きいのかな。