4

したがって、これは最初は単純に見えましたが、Googleとここをクロールした後、答えは私が最初に思ったほど単純ではないようです。

基本的に、私はオペレーティングシステムコースの実践の一部としてMINIXカーネルを編集しており、InformationServerのファンクションキーを押したときに実行中のプロセスの数を吐き出す小さな関数を追加する必要があります。他のすべてのものが機能するように機能を統合する方法を理解しましたが、私の人生では、システムで実行されている現在のプロセス数をCコードと変数に取得する方法を理解できません。プリントアウト。

最初に、SYS_NUMPROCSのような気の利いたSyscallか、値を返す何かがあると思いましたが、運がありませんでした。次に、システム( "ps -ax | wc -l")からファイルに出力をパイプしようとしましたが、ファイルは作成されませんでした。popen()を使用してみましたが、うまくいきませんでした。バッファに単純な「ls」を読み込んでも、コードを爆破してコードの実行を「ハング」させるだけなので、出力はありません。

だから今、私は本当に困惑しています、そしてこの時点で私はすべての明白なオプションを使い果たしたので、どんな助けも非常に素晴らしいでしょう。

私が今考えることができるのは、すべてのプロセスをカウントするループだけですが、最初にシステムのプロセスリストにアクセスする必要があり、ディレクトリとしての/ proc /について漠然とした話を聞いたことがありますが、私はそうしていません。それにアクセス/実行する方法、または最初にプロセスの数を取得するためにどのようにリンクするかについての手がかり。

スタックに感謝します(笑しゃれ)、みんな:)

また、私が試したもののどれも私に喜びを与えなかったので、私が化粧品の出力のための基本的な印刷以外に何も書いていなかったので、私は明示的にコードを含めませんでした:/

編集メモ:みんな、これはカーネル編集です-私はシステムCファイルの情報をprintfする関数を書いています。次に、カーネルを再コンパイルし、システムを再起動してテストします。これはUNIX(MINIX)カーネルであり、Linuxカーネルではなく、ユーザーモードプログラムでもありません。

popen()の私のコードは、あなたの何人かが要求したように、次のとおりです。

public void cos_dmp(){
    char buffer[512];
    FILE * f;

    f = popen("ps -ax | wc -l","r");

    fgets(buffer, sizeof(buffer),f);

  //buffer should now contain result of popen()

     printf(buffer);
}

それは私が覚えているものから少しハッキングされたバージョンであり、それを非常にシンプルに保ち、私がやろうとしていたことを皆さんに示しています。ただし、基本的にsystem()呼び出しの出力を呼び出す以外に、これを行うためのより良い方法が必要です。

もう一度編集します。上記のコードはユーザープログラムからは完全に機能しますが、カーネル関数からは機能しません。誰かが理由を知っていますか?:/

4

8 に答える 8

3
struct kinfo kinfo;
int nr_tasks, nr_procs;
getsysinfo(PM_PROC_NR, SI_KINFO, &kinfo);
nr_procs = kinfo.nr_pro;

これにより、実行中のプロセスの数が得られます

于 2011-09-03T18:44:07.893 に答える
3

ps が何をするか見てみてください。そのソース コードを見てください。プロセスがいくつあるかを知っています

于 2011-08-29T18:46:04.890 に答える
3

system("ps -ax | wc -l")の結果を取得するために作成したコード、または使用するために作成したコードを見せてpopenいただければ、問題の診断に役立てることができます。

とにかく、システム上に存在する (実行中のプロセスとは異なる) プロセスの数をカウントする最も効率的な方法はopendir("/proc")、10 進数の文字列であるエントリの数をカウントすることです。システム内の各プロセスは、そのプロセスの 10 進数のプロセス ID 番号にちなんで名付けられた/procのサブディレクトリによって表されます。

したがって、たとえば「/proc/3432」が見つかった場合、pid が「3432」のプロセスが存在することがわかります。名前が 10 進数であるサブディレクトリの数を数えるだけです。


仮定:

  • MINIXではなくLinuxについて質問しています。
  • カーネルを変更するのではなく、ユーザーモードのプログラムを作成しています。
于 2011-08-29T18:47:46.337 に答える
1

私は私の大学で同じ課題を抱えていたので、誰かが将来それを必要とする場合は私の解決策を投稿します. 仮想マシンに Minix 3.3 と VMware プレーヤーを使用しています。
/usr/src/ minix /servers/pmにあるpmサーバーには、pm サーバーが使用するさまざまなグローバル変数を含むglo.hファイルがあります。そのファイルには、幸いにもprocs_in_useと呼ばれる 1 つの変数があり、システム コールから非常に 単純に、現在実行中のプロセスの数が表示されます。ループの途中でユーザー空間プログラムに関数を 追加することで、これをテストできます。EXTERN int procs_in_use;
printf("%d\n",procs_in_use);fork()

もう1つの言及:最初の答え

struct kinfo kinfo;
int nr_tasks, nr_procs;
getsysinfo(PM_PROC_NR, SI_KINFO, &kinfo);
nr_procs = kinfo.nr_procs;

私にはうまくいきませんでした。SI_KINFOもう存在しないので、使用する必要がありますSI_PROC_TABLE。また、権限に問題がある可能性があるため、通常のシステム コールからこの関数を呼び出すことはできません。sys_getkinfo(&kinfo)新しいシステムコールから呼び出すことができ、上記と同じことを行う代替関数があります。問題はkinfo.nr_procs、現在のプロセスの数ではなく、デフォルトで 256 であるオペレーティング システムに存在できる最大ユーザー プロセスの数を返し、NR_PROCS が定義されているファイルで手動で変更できることです。一方、kinfo.nr_tasksオペレーティングシステムが保持できるカーネルプロセスの最大数を返します。デフォルトでは 5 です。

于 2015-09-17T13:44:35.480 に答える
0

これをチェックしてください:http://procps.sourceforge.net/

この種のことを行う多くの小さなユーティリティのソースがあります。それは良い学習経験になるでしょう:)そして、pm100が指摘したように、PSはそこにあると思います.

于 2011-08-29T18:56:17.417 に答える
0

If you're editing the kernel, the most efficient way to solve this problem is to maintain a count every time a process (i.e., a task_struct entry) is created (and make sure you decrement the count every where a process terminates).

You could always loop through the list of processes in the kernel using the built-in macro (but its expensive, so you should try to avoid it):

struct task_struct *p;
unsigned int count = 0;
for_each_process(task) {
    count++;
}
于 2011-08-29T18:57:46.233 に答える