質問

は以下の用途はPID 50と特定のプロセスのARGVを取得するためのsysctlことC /オブジェクト - Cコードスニペット切り詰めダウン(エラー/ヌルチェックは省略)である。

...
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);
...

(ARGV列配列のサイズを決定する)のsysctlの最初の呼び出しが成功しました。返される長さは、〜1600年、私が予想よりも大きいですが、私は不合理ではないと仮定します。 malloc関数は成功します。 sysctlのリターンへの2回目の呼び出し-1、22、E_INVALをerrnoに設定します。

私はからそれを含め、他のコードを見てきましたこの質問ではなく、鉱山での問題を見ることができません。私は何をしないのですか?

役に立ちましたか?

解決

私はプログラムにあなたのコードを包む試みたが、それは他のプロセスのargvのなどから罰金やプリントを作品のするとき、自分のプロセスの一つを問い合わせるの、すなわち、同じUIDを持つ1プロセス起動sysctl()ます。

プロセスの環境変数は、コマンドライン引数としてだけでなく返されるので、側面がある「私が期待するよりも大きな」。 (これは、すべてこの情報のフォーマットが何であるかは明白ではありません。)

の異なるのユーザーのプロセスを問い合わせるとき、私はあなたが見てきたことを二sysctlから同じEINVALを取得します。私は、これは他の人のプロセスについての不当な好奇心と考えられていると思いますが、あなたは最初sysctlがあまりにも失敗するだろうと思うと思います。

(実在しないpidを問い合わせる場合は、最初のsysctlはEINVALで失敗する。)

これは、すべての大規模underdocumentedているように見える:Leopard上で、KERN_PROCARGSでもsysctlのmanページには表示されません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top