Path: sran265!katsu From: katsu@sran14.sra.co.jp (WATANABE katsuhiro) Message-ID: Date: 11 Jan 93 08:47:19 Organization: Software Research Associates, Inc.,Japan In-reply-to: t90223tg@sfc.keio.ac.jp's message of 30 Nov 92 20:24:13 GMT Newsgroups: fj.unix,fj.lang.c Followup-To: fj.unix Subject: Re: process Distribution: fj References: (Followup-To: に注意)  フォローの遅さなら *.jp で十指に入るであろう渡邊@SRAです。 記事 で t90223tg@sfc.keio.ac.jp (Tetsuya Gotou) さんいはく > 自分の権限で動かしているプロセスの、名前、pid、status、nice値などを > 調べるという事をしたいのです。 > spsのソースをみて、/dev/kmemをオープンしてなにかする。 > というところまではわかったのですが、どうもはっきりしません。  Unix での話ですよね? fj.unix の方がいいと思いますよ。  これは機種と OS に依存する話となります。しかし、多くの UNIX とりわけ BSD に由来する OS では、おおよそ以下のような方針が適用できると思います。  各プロセスの名前(accounting に使われるもの)や pid 等の属性は、 proc 構造体内に表現されます。また、全てのアクティブなプロセスの proc 構造体は、プロセステーブルに登録されています。つまり、 プロセステーブルを適当な方法で走査していって、目的のプロセスの proc 構造体を見つければ上記のことは達成できそうな感じがします。  プロセステーブルは、カーネル仮想記憶空間上の proc 番地から始まり、 proc 構造体が nproc 個入っているという形です。   をながめると、pid, status, nice 値が proc 構造体の どこにあるかは見つけられると思います。見つからない場合は、機種と OS を明らかにして適当なニュースグループで質問するとよいでしょう。  プロセスの名前についてはカーネルが accounting に用いているもの (ps -c で出てくるもの)は簡単に取り出せそうです。しかし一方いわゆる argv[0] の方はユーザー空間に存在しており、スワップ空間から引き出さねば ならない場合が考えられるなど、少しだけ面倒になるかもしれません。  カーネル仮想記憶空間上のデータを参照するには、/dev/kmem を open し、目的のアドレスへ lseek して read します。  proc や nproc などのカーネル変数のアドレスを決定するには、nlist(3) を使えばよいでしょう。  最近の SunOS ならば、kvm_getproc(3) という proc 構造体を引き出して くれる関数や、kvm_getcmd(3) というコマンド名 (argv 他) を引き出して くれる関数が利用できます。  ところで、速度や信頼性に若干の難があってもよいなら、pstat -p と ps を組合せるだけでも(BSD 系なら)かなりのことができますよ。 -- 渡邊克宏@SRAソフトウェア工学研究所