リモートプロセスの入力引数をプログラムで取得したいので、次の方法でsysctlを使用しました(部分コード):
int mib[3]
mib = {CTL_KERN, KERN_ARGMAX,0,0}
size = sizeof(argmax);
if (sysctl(mib, 2, &argmax, &size, NULL, 0) == -1) {
goto ERROR_A;
}
procargs = (char *)malloc(argmax);
mib = {CTL_KERN,KERN_PROCARGS2,pid,0}
size = (size_t)argmax;
if (sysctl(mib, 3, procargs, &size, NULL, 0) == -1) {
printf("a");
goto ERROR_B;
}
ただし、すべてのプロセスで機能するわけではありません。これが実際のケースです:
/System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker -c MDSImporterWorker -m com.apple.mdworker.shared
しかし、以下のケースは「sysctl(mib, 3, procargs, &size, NULL, 0)」で失敗しました。ただし、ターミナルから「ps ax PID」を使用してコマンドラインを正常に取得しました
0 655 501 0 10:55AM ttys008 0:00.02 login -pfl zohar81 /bin/bash -c exec -la bash /bin/bash
おそらく、2 番目の例で KERN_PROCARGS2 を指定して sysctl を呼び出すと失敗した理由を教えていただけますか?
ありがとう