احصل على عملية أخرى 'Argv في OS X باستخدام C.

StackOverflow https://stackoverflow.com/questions/210397

  •  03-07-2019
  •  | 
  •  

سؤال

أريد الحصول على عملية أخرى "Argv مثل PS.

أنا أستخدم Mac OS X 10.4.11 تشغيل على Intel أو PowerPC.

أولاً ، قرأت كود PS و Man KVM ، ثم كتبت بعض كود C.

#include <kvm.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/sysctl.h>
#include <paths.h>

int
main(void) {
    char errbuf[1024];
    kvm_t *kd = kvm_openfiles(_PATH_DEVNULL, NULL, _PATH_DEVNULL, O_RDONLY, errbuf);
    int num_procs;
    if (!kd) { fprintf(stderr, "kvm_openfiles failed : %s\n", errbuf); return 0; }
    struct kinfo_proc *proc_table = kvm_getprocs(kd, KERN_PROC_ALL, 0, &num_procs);

    for (int i = 0; i < num_procs; i++) {
        struct kinfo_proc *pproc = &proc_table[i];
        char **proc_argv = kvm_getargv(kd, pproc, 0);
        printf("%p\n", proc_argv);
    }

    kvm_close(kd);
    return 0;
}

عندما ركض على PowerPC ، kvm_getargv() عاد دائما لاغية. عندما ركض على إنتل ، kvm_openfiles() فشل مع الخطأ /dev/mem: No such file or directory.

من المحطة ، أعرف عن الإذن.

ثانياً ، حاولت sysctl.

#include <sys/sysctl.h>
#include <stdio.h>
#include <stdlib.h>
#define pid_of(pproc) pproc->kp_proc.p_pid

int
main(void) {

   int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 };
   int buffer_size;
   sysctl(mib, 4, NULL, &buffer_size, NULL, 0);

   struct kinfo_proc *result = malloc(buffer_size);
   sysctl(mib, 4, result, &buffer_size, NULL, 0);

   int num_procs = buffer_size / sizeof(struct kinfo_proc);
   for (int i = 0; i < num_procs; i++) {
       struct kinfo_proc *pproc = result + i;
       int mib[3] = { CTL_KERN, KERN_PROCARGS, pid_of(pproc) }; // KERN_PROC_ARGS is not defined
       char *proc_argv;
       int argv_len;
       sysctl(mib, 3, NULL, &argv_len, NULL, 0);
       proc_argv = malloc(sizeof(char) * argv_len);
       sysctl(mib, 3, proc_argv, &argv_len, NULL, 0);
       fwrite(proc_argv, sizeof(char), argv_len, stdout);
       printf("\n");
       free(proc_argv);
   }

   return 0;
}

بواسطة Fwrite ، حصلت على Argv [0] ولكن Argv [1 ..] ليست (تتم طباعة متغيرات البيئة.)

لم يعد هناك طريقة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

في 10.6 ، يتوفر kern_procargs2: https://gist.github.com/770696

يتم استخدام هذه الطريقة من PS ، Procfs على MacFuse ، إلخ.

نصائح أخرى

لقد كنت في الواقع بحاجة إلى نفس الشيء بالنسبة لمكتبة بيثون التي أكتبها ، وفي بحثي ، صادفت بيثون آخر (PSI) الذي ينفذ هذا في رمز C. إنه جزء من رمز وحدة Python لعمليات الإدراج ويتضمن سرد الوسائط لكل عملية أيضًا. يمكنك إلقاء نظرة على الكود المصدري لذلك للحصول على مثال عمل:

darwin_process.c - التمرير لأسفل إلى set_exe () للرمز ذي الصلة

ملاحظة: الموقع هو حقًا بطيئة لذا يجب أن تكون صبورًا قليلاً أثناء تحميله.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top