2010-12-16 22 views
13

私はマルチスレッドアプリケーションを持っていますが、htop(例として)は実行中の各スレッドごとに異なる名前を表示したいと思います。メイン。linux(htop)にスレッド名を変更

私は

prctl(PR_SET_NAME, .....) 

を使用して試してみましたが、それは唯一の可能な16バイトまでの名前を指定されたトップとし、その呼び出しでのみ動作します。

私は、/ proc/PID/cmdlineの内容を変更することがトリックだと思いますが、それは読み取り専用フィールドです。

これを達成する方法は誰でも知っていますか?

答えて

5

スレッド単位とプロセス単位の設定を区別する必要があります。

prctl(PR_SET_NAME、...)はスレッドごとに名前を設定します(例:ps Hcx)。psにその名前を強制的に表示させることができます。一番上のcスイッチでも同じことができるので、htopは同様の機能を持っていると仮定します。

"ps"は通常あなたに表示されます(ps Haxなど)は、あなたがプログラムを起動したコマンドライン名と引数です(実際には/ proc/PID/cmdlineが教えてくれるものです)。 argv [0](元の長さまで)ですが、これはプロセス単位の設定です。つまり、異なるスレッドに異なる名前を与えることはできません。 htopオプションがある、バージョン0.8.4以来

// procname is the new process name 
char *procname = "new process name"; 

// Then let's directly modify the arguments 
// This needs a pointer to the original arvg, as passed to main(), 
// and is limited to the length of the original argv[0] 
size_t argv0_len = strlen(argv[0]); 
size_t procname_len = strlen(procname); 
size_t max_procname_len = (argv0_len > procname_len) ? (procname_len) : (argv0_len); 

// Copy the maximum 
strncpy(argv[0], procname, max_procname_len); 
// Clear out the rest (yes, this is needed, or the remaining part of the old 
// process name will still show up in ps) 
memset(&argv[0][max_procname_len], '\0', argv0_len - max_procname_len); 

// Clear the other passed arguments, optional 
// Needs to know argv and argc as passed to main() 
//for (size_t i = 1; i < argc; i++) { 
// memset(argv[i], '\0', strlen(argv[i])); 
//} 
+2

提出者がいない、スレッドごとの設定を求めていましたか? –

+0

なぜあなたはargv [0]の長さに制限されますか? – user2815333

16

:後

は、私は通常、全体のプロセス名を変更するために使用するコードです表示するカスタムスレッド名

プレスをF2を選択し、Display optionsメニューを選択します。あなたは、表示されるはずです。

htop custom thread names

関連する問題