コメントの 1 つに prctl
が言及されています 、しかし、これは本当に独自の答えに値します。なぜなら、設定 argv[0]
すべての場合に機能するとは限りません (私のシステムでは何もしません)。
Linux でスレッドの名前を設定するためのライブラリ呼び出しが少なくとも 2 つあります。どちらも 15 文字に制限されており、最後に NUL
が付きます。 バイト:
pthread_setname_np(...)
np
「非移植性」の略ですが、これは他の OS にも存在する可能性があります:https://linux.die.net/man/3/pthread_setname_npprctl(PR_SET_NAME...)
これも移植性がありません:https://linux.die.net/man/2/prctl例
さまざまなメソッドのテストを次に示します (エラー処理なし):
// gcc pstest.c -o pstest -O2 -Wall -Wextra -Werror -Wno-unused -Wno-unused-result -std=gnu99 -pthread -D_GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/prctl.h>
int main(int argc, char *argv[])
{
puts("Initial ps output:");
system("ps | grep pstest");
puts("\npthread_setname_np");
pthread_setname_np(pthread_self(), "setname");
system("ps | grep setname");
puts("\nprctl");
prctl(PR_SET_NAME, (unsigned long)"prctl", 0, 0, 0);
system("ps | grep prctl");
puts("\nargv[0]");
argv[0] = "argv0";
system("ps | grep argv0");
return 0;
}
argv[0]
の後に出力がないことに注意してください :
./pstest
Initial ps output:
17169 pts/0 00:00:00 pstest
pthread_setname_np
17169 pts/0 00:00:00 setname
prctl
17169 pts/0 00:00:00 prctl
argv[0]
野生
実稼働コードの例を次に示します (いつものように、GitHub でコードを見るときは必ずライセンスに注意してください)
こちらもご覧ください
これらの質問と回答も参照してください:
- https://unix.stackexchange.com/questions/167490/how-can-a-process-appear-to-have-different-name-in-ps-output
- prctl PR_SET_NAME を使用してプロセスまたはスレッドの名前を設定しますか?
原則を説明するために、これは機能するはずだと思います...
#include <stdio.h>
int main(int argc, char *argv[]) {
argv[0][0] = 65;
sleep(10);
}
名前を変更し、最初の文字の代わりに「A」を付けます。 CtrlZ で一時停止してから ps
を実行します 名前が変更されたことを確認します。手がかりはありませんが、 argv[0]
に依存している可能性があるため、やや危険なようです。 .
また、ポインター自体を別の文字列に置き換えてみました。葉巻はありません。したがって、これは strcpy
でのみ機能します 元の名前よりも短いか等しい文字列。
これにはもっと良い方法があるかもしれませんし、ないかもしれません。わかりません。
編集:非リテラルの解決策:分岐している場合は、子の PID (getpid()
) を知っています。 子では、fork()
の結果 親で)。読める場所に出力して、PID で子を殺してください。
別の非リテラルな解決策:実行可能ファイルへのソフトリンクを別の名前 (ln -s a.out kill_this_a.out
) で作成します。 )、実行するときに、リンクを実行します。この名前がリンクの名前になります。
これは移植性のないハックです:
/*
* Sets process title, truncating if there is not enough space,
* rather than causing memory corruption.
*/
void set_title_np(int argc, char **argv, const char *title) {
// calculate available size
size_t space = 0;
for (int i = 0; i < argc; i++) {
size_t length = strlen(argv[i]);
space += length + 1; // because of terminating zero
}
memset(argv[0], '\0', space); // wipe existing args
strncpy(argv[0], title, space - 1); // -1: leave null termination, if title bigger than space
}
このコメントによると、 prctl(PR_SET_NAME)
スレッドの「短い名前」にのみ影響します。 /proc/self/comm
に書き込むのと同じ効果があります .
「長い名前」(/proc/self/cmdline
)を変更するには htop
で実際に使用されています と ps u
)醜いハックが必要です(そのコメントに記載されていますが、リンクは無効です)。この種のハッキングの例は、Chromium ソース コードにあります:https://source.chromium.org/chromium/chromium/src/+/master:content/common/set_process_title_linux.cc