1

Linux-2.6.35.13 kernel/sched.c には関数 find_process_by_pid() があります。次のコードで試します:

int main()
{
    struct task_struct *p;
    pid_t pid;
    pid=2130; 

    p = find_process_by_pid(pid);

    printf("task_struct.state: %s\n", p->state);
    return 0;
}

$ gcc getProcbyId.c -o getProcbyId

次の警告とエラーが表示されます。

getProcbyId.c: In function 'main':
getProcbyId.c:19:4: warning: assignment makes pointer from integer without a cast
getProcbyId.c:21:37: error: dereferencing pointer to incomplete type

この問題を解決する方法についてアドバイスをお願いします。

4

2 に答える 2

7

ユーザー モード アプリケーション プログラムを内部カーネル機能に直接リンクすることはできません。代わりに、カーネルが適切なチェックと変換を適用するエクスポートされた機能とのやり取りに、セキュリティやメモリ モデルの違い (一般的な設計のクリーンさは言うまでもありません) などの理由で制限されます。

syscall は、ユーザー空間コードから呼び出すことができるように意図されたカーネル関数の小さなサブセットであり、これはそれらの 1 つではありません。

外部プロセスに関する情報を見つけるための主要なインターフェイスは、/proc ファイルシステムの下の PID エントリです。基本的に、これは一連の疑似ファイルで構成されています。これらのほとんどはテキスト ファイルであり、1 つを読み取ろうとすると、カーネルが適切な情報を収集して、実際のファイルの内容であるかのように提供します。/proc/PID##/sched と、番号付きのスレッド サブディレクトリの下にある同様のファイルに興味があるかもしれません。

プロセスを所有している場合は、それを ptrace() して、そのプロセスのビューを見て回ることができますが、それは、そのプロセスのカーネルのビューで多くのことを行うよりも、他のプロセスのユーザー空間ビューにプロキシする場合です。

于 2012-05-09T16:11:18.447 に答える
1

一般的な観点から、エラーはコードにヘッダーファイルがないことが原因のようです。関数は構造体へのポインタを返します:struct task_struct * しかし、構造体のフィールドにアクセスするとき、コンパイラはその定義を知る必要があるため、エラーが発生します

とにかく、ユーザースペースから上記の関数を呼び出すことができますか?

このトピックで役立つと思われるドキュメント(少し古いものですが)はカーネルです-ユーザースペースインターフェイス

于 2012-05-09T15:48:47.950 に答える