1

リモートプロセスの入力引数をプログラムで取得したいので、次の方法で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 を呼び出すと失敗した理由を教えていただけますか?

ありがとう

4

1 に答える 1