プロセスがシステムプロセスであるかどうかを確認するには?

プロセスがシステムプロセスであるかどうかを確認するには?

/procすべてのプロセスを見つけるためにディレクトリ(または疑似ファイルシステム)を読み込んでいます。私はそれから必要な情報を取得していますが、/proc/[pid]/status別のものが必要です。どのプロセスがシステムにとって重要であるかを理解する方法はありますか?たとえば、プロセスの親pidまたはUIDを使用しますか?

システムプロセスとは、オペレーティングシステムの新規インストールとアプリケーションまたはサービスのインストール前に存在するプロセスを意味します。これはカーネルスレッドやシステムプロセスをまったく意味しないかもしれませんが、要約すると、プロセス、プロセス終了、会議システムの基本構造を破壊します。

PS。 Androidアプリを開発していますが、この部分は純粋なLinuxファイルシステムを使用して進行しているので、ここに質問をしたところ、あまり違いはないようです。

ベストアンサー1

その場合は、+を押してカーネルスレッドの表示を切り替えるhtopことができます。ツリーモードを押すと、すべての子として表示されます。ShiftkF5kthreadd

そこはいカーネルスレッドとユーザー空間スレッドのいくつかの注目すべき違いは次のとおりです。

  • /proc/$pid/cmdlineカーネルスレッドの場合、NULL - psとtopがカーネルスレッドを区別する方法です。

  • シンボリック/proc/$pid/exeリンクにカーネルスレッドのターゲットはありません。これは、ファイルシステムに対応する実行ファイルがないため意味があります。

具体的には、readlink()ENOENTリンク自体は存在しますが、システムコールは「対応するファイルやディレクトリがありません」を返し、プロセスの実行可能ファイルが存在しないことを示します。

したがって、カーネルスレッドを確認する信頼できる方法は、対応する戻りコードを呼び出して確認することreadlink()です。成功するとユーザープロセス/proc/$pid/exeです。$pid失敗して表示された場合は、アドインを介してカーネルスレッドとENOENT終了したばかりのプロセスを区別する必要があります。stat()/proc/$pid/exe

  • /proc/$pid/statusほとんどのカーネルスレッドには、いくつかのフィールド、特に仮想メモリに関連するいくつかのフィールドがありません。

上記の回答は次のようになります。カーネルスレッドの識別

カーネルスレッドを他のプロセスと区別する別の方法はtop -ctopマニュアルから:

3. コマンド - コマンド名またはコマンドライン
ジョブの開始に使用されるコマンドラインまたは関連プログラムの名前を表示します。コマンドラインオプションとインタラクティブコマンド「c」を使用して、コマンドラインと名前を切り替えることができます。

コマンドラインを表示を選択すると、コマンドラインのないプロセス(カーネルスレッドなど)は、次の例に示すように、括弧内にプログラム名のみを表示します。
[ mdrecoveryd ]

実行中は、ps aux角かっこ内にコマンドなしで開始されたプロセスも表示されます(そして空の/proc/[pid]/cmdlineファイルが表示されます)。

例:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        19  0.0  0.0      0     0 ?        S<   Mar02   0:00 [kworker/1:0H] 

包装ビューprocps-3.2.8文書/proc/readproc.h

// Basic data structure which holds all information we can get about a process.
// (unless otherwise specified, fields are read from /proc/#/stat)
//
// Most of it comes from task_struct in linux/sched.h

おすすめ記事