スレッド名:/proc/pid/commは、常に/proc/pid/statusのName:行と/proc/pid/statの2番目のフィールドと同じですか?

スレッド名:/proc/pid/commは、常に/proc/pid/statusのName:行と/proc/pid/statの2番目のフィールドと同じですか?

Linuxスレッドまたはフォークされたプロセスは、psファイルシステムおよび/またはそのコマンドラインに表示される名前を変更できます/proc

このパッケージを使用すると、、、、およびの2番目のフィールドpython-setproctitleにも同じ変更が発生します。これには全長のみが表示され、変更された名前の最初の15文字は残りの3つの場所に表示されます。/proc/pid/cmdline/proc/pid/commName:/proc/pid/status/proc/pid/statcmdline

マルチスレッドプロセスを見ると、ruby外観は/proc/pid/cmdline変わりませんが、他の3つの場所には15文字の切り捨てられたスレッド名が表示されます。

man prctlTellsは/proc/pid/commシステムコールの動作によってPR_SET_NAME変更されますが、およびについては何もprctl言いません。/proc/pid/status/proc/pid/stat

man proc/proc/pid/commスーパーセットが提供されるとし、これ以上のprctl PR_SET_NAME説明は省略します。
これは、プロセスが置き換えられても、2番目のフィールドを引き続き/proc/pid/stat使用できることを示しています。

JVMプロセスを観察するときに言及されたすべての場所はすべてのスレッドに同じコンテンツを提供します(表示されているすべての場所をcmdline除く3つの場所java)、jcmd pid Thread.printまだ既存のスレッドに対して別のスレッド名を表示するため、Javaスレッドはいくつかの非標準メカニズムを使用して名前を変えてください。

行と2番目のフィールドは常に/proc/pid/comm同じですか、それとも3つの場所のうちの1つが異なる内容を提供する場合はありますか?違いがある場合(簡単に再現できる)例を提供してください。Name:/proc/pid/status/proc/pid/stat

答え1

3つの項目はすべて、カーネルソースコードに厳密に定義されています。commstatstatus。ジョブはそこから開始してcomm処理されます。comm_showどの電話proc_task_nameジョブ名を決定します。statによって処理されたproc_tgid_stat、薄い包装紙です。do_task_stat、どちら着信電話proc_task_nameジョブ名を決定します。statusによって処理されたproc_pid_statusproc_task_name、ジョブ名を決定するために呼び出されます。

はいcomm。 「名前」行とstatus2番目のフィールドは両方ともstat同じ値を表示します。唯一の変更は、値がエスケープされるかどうかです。値はstatusエスケープされ(特殊文字は置き換えられます)、残りはそうではありません。

関連情報