1

以下は、sysctlを使用してPID50の特定のプロセスのargvを取得するC/ Obj-Cコードの簡略化された(エラー/ nullチェックは省略)スニペットです。

...
int getProcessArgs[3] = { CTL_KERN, KERN_PROCARGS, 50 };
sysctl(getProcessArgs, 3, NULL, &length, NULL, 0);
char* processArgs = malloc(length * sizeof(char));
sysctl(getProcessArgs, 3, processArgs, &length, NULL, 0);
...

sysctlへの最初の呼び出し(argv文字列配列のサイズを決定するため)は成功します。返される長さは約1600で、予想よりも大きくなりますが、不合理ではないと思います。Mallocは成功します。sysctlへの2番目の呼び出しは-1を返し、errnoを22、E_INVALに設定します。

私はこの質問からのコードを含む他のコードを見てきましたが、私の問題はわかりません。私は何が欠けていますか?

4

1 に答える 1

2

私はあなたのコードをプログラムにラップしようとしましたが、それはうまく動作し、自分のプロセスの1 つ、つまり を呼び出すプロセスと同じ uid を持つものについて問い合わせると、他のプロセスの argv などを出力しますsysctl()

「予想よりも大きい」という側面は、プロセスの環境変数とコマンドライン引数が返されるためです。(このすべての情報の形式が何であるかは明らかではありません。)

のユーザーのプロセスについて問い合わせるsysctlと、あなたが見てきた秒から同じ EINVAL が返ってきます。これは、他の人のプロセスに対する不当な好奇心と見なされると思いますが、最初のプロセスsysctlも失敗すると思います。

(存在しない pid について問い合わせると、最初sysctlは EINVAL で失敗します。)

これはすべて、非常に文書化されていないようです。Leopardでは、 man ページKERN_PROCARGSにも表示されません。sysctl

于 2010-04-02T19:52:19.123 に答える