Path: katsu From: katsu@sra.co.jp (WATANABE Katsuhiro) Message-ID: Date: 18 Jun 1996 21:41:02 GMT Organization: Software Research Associates, Inc., Japan In-reply-to: Takanari HAYAMA's message of 26 Apr 95 03:55:00 GMT Newsgroups: fj.lang.c,fj.questions.unix Subject: Re: for Help ps References: <3nif3f$3ch@dst42.cedd.kajima.co.jp> Distribution: Mime-Version: 1.0 (generated by tm-edit 7.47) Content-Type: text/plain; charset=ISO-2022-JP あまりのフォローの遅さが議論の妨げになっていたらごめんなさい。 記事 で taki@softlab.is.tsukuba.ac.jp (Takanari HAYAMA) さんいはく > On 04/25/95(18:23) namekawa@cedd.kajima.co.jp (Koichi Namekawa) wrote > in <3nif3f$3ch@dst42.cedd.kajima.co.jp> (fj.questions.unix:5183/maple): > |コマンド名(COMMAND)で、それに相当するプロセスID番号(PID)を > |取得する方法(関数)はありますか? > |(% ps aux の COMMAND / PID に相当する) > > コマンド名は、システム内でプロセスを特定するための > 一要素でしかなく、コマンド名のみで PID を特定するこ > とは不可能です。システムで一意なのは、PID のみです。 端山さんはご存知だと思いますが、より明確に言い直すと、... カーネル内でコマンド名はプロセスを特定する一要素ですらなく、 プロセスを同定する目的には *全く* 使われていないはずです。 accounting 関係に使われるだけではないでしょうか。 > kvm_open() でカーネルを開くと、全プロセスの PCB > (Process Control Block) を覗くことができます。以下は、 > その例です。現在動作中の各プロセスと、その起動時に指 > 定されたアーギュメントを抽出します。ただ、このプログ > ラムだと swapper と pagedaemon だけは、抽出できない > んですよね……。どなたか方法を知りませんか? pid 0 や pid 2 のコマンド名がカーネルの外から execve(2) で与えられる ことは決してありえないので、もしこれらに名称が存在するならば、その 名称は /vmunix の中に埋め込まれている必要があります。しかし、strings, od -s 等で、"swapper", "pagedaemon" のような文字列はみつかりません。 よって、 (a) カーネル内において pid 0 のコマンド名は定義されない (b) カーネル内において pid 0 のコマンド名は swapper ではない のいずれかが成立します。そして、諸般の状況からは、(a) と考えるのが 妥当ではないでしょうか。 strings /bin/ps してみてください。swapper と pagedaemon という 文字列が見えます。思うに、ps(1) では if (pid == 0) printf("swapper"); のように hard code してあるのでしょう。 以上の話は SunOS, Solaris 以外にもだいたい当てはまると思っています。 > kvm_open() でカーネルを開くと、全プロセスの PCB > (Process Control Block) を覗くことができます。以下は、 > その例です。 > u = kvm_getu(kd, p); > if (kvm_getcmd(kd, p, u, &arg, (char***)NULL) < 0) { p が zombie process だと、u area がもはや存在しないのだから kvm_getu() が当然失敗して、u に有効な値を保持しないと思います。 単なる例なのに、詳細に立ち入り過ぎだったらごめんなさい。 -- 渡邊克宏@SRA