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の構造体もここまで大きいのかな。