Mac OS X: الحصول على معلومات عملية مفصلة (على وجه التحديد وسيطات التشغيل الخاصة بها) للتطبيقات التعسفية باستخدام PID

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

سؤال

أحاول اكتشاف متى يتم إطلاق تطبيقات معينة.

حاليا أنا أستخدم NSWorkspace, ، التسجيل للحصول على إشعار "DID Lachse Application". أنا أيضا استخدام runningApplications طريقة للحصول على التطبيقات التي يتم تشغيلها حاليًا عند بدء تشغيل تطبيقي.

بالنسبة لمعظم التطبيقات ، فإن اسم حزمة التطبيق يكفي. لديّ مجموعة من "التطبيقات المعروفة" التي أتحقق منها باسم ذلك الذي تم تمريره في الإشعار.

يعمل هذا بشكل جيد حتى تصادف تطبيقًا يعمل كبديل لإطلاق تطبيق آخر باستخدام وسيطات سطر الأوامر.

مثال: لا تحتوي البوابة التي تم إصدارها حديثًا على جهاز Mac على حزمة تطبيق مخصصة. يمكن للبخار إنشاء اختصار ، والذي لا يمثل سوى إطلاق hl2_osx التطبيق مع -game حجة و portal كما هي المعلمة.

نظرًا لأن المزيد من الألعاب المستندة إلى المصدر تتجه إلى جهاز Mac ، أتصور أنها ستستخدم نفس الطريقة لإطلاقها ، وتشغيلها بشكل فعال hl2_osx التطبيق مع -game جدال.

هل هناك طريقة لطيفة للحصول على قائمة بالوسائط (ومعلماتها) باستخدام واجهة برمجة تطبيقات الكاكاو؟

NSProcessInfo يقترب ، ويقدم طريقة "arguments" ، ولكنها توفر فقط معلومات لعمليتها الخاصة ...

NSRunningApplication يوفر القدرة على الحصول على معلومات حول التطبيقات التعسفية باستخدام PID ، ولكن لا يوجد ARGS سطر الأوامر ...

هل هناك أي شيء يملأ الفجوة بين الاثنين؟

أحاول عدم السير في طريق التفريخ NSTask يهرب ps -p [pid] وتوحل الإخراج ... أفضل أن يكون هناك شيء عالي المستوى.

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

المحلول

يمكنك استخدام أي شيء ps الاستخدامات ، على الرغم من أنها لا تعتمد على الكاكاو. بالنسبة الى سينغ, ps يعتمد على مكالمات KVM و SYSCTL. سكب فوق مصدر, ، يبدو أن المكالمات الهادئة kvm_openfiles, kvm_getprocs و kvm_getargv. للحصول على وسيط سطر الأوامر ، المكالمة الأولى kvm_openfiles للوصول إلى مساحة ذاكرة kernel ، ثم استخدم kvm_getprocs للحصول على معلومات عملية kernel ، ثم kvm_getargv.

استخدام sysctl في ps يبدو أقل صلة بهدفك ؛ يتم استخدامه للحصول على معلومات أخرى ، مثل معرف المجموعة ومعرف Proces Proces. اسم sysctl معين المستخدم هو {CTL_KERN, KERN_PROC, KERN_PROC_أيّ, أعلام}, ، أين أيّ يحدد مرشح العملية (على سبيل المثال ALL, PID) و أعلام هي وسيطات للمرشح (التفاصيل موجودة في sysctl صفحة الرجل).

OS X ليس لديه دعم procfs ، لكن سينغ طور أ نسخة قائمة على الصمامات, ، صدر تحت GPLV2. إذا قمت بتجميعه مع تطبيقك ، فسيتعين عليك إصداره ضمن GPLV2 أيضًا. يتم إصدار معظم macfuse تحت أ ترخيص على غرار BSD, ، بحيث يمكن توزيعها باستخدام تطبيقك دون جعله مفتوح المصدر (يتم إصدار Fusefs/Fuse_nodehash.c بموجب ترخيص Apple Open Source ، ولكنه يتيح أيضًا ربط تطبيقات المصدر المغلقة).

السؤال "احصل على عملية أخرى 'Argv في OS X باستخدام C."يجب أن يكون مفيدًا ، لأنه يحتوي على نموذج رمز باستخدام KVM و SYSCTL. TN 2050 "مراقبة عملية العمر دون الاقتراع" قد تكون مفيدة أيضًا لك.

نصائح أخرى

كلا - الجري ps هو أفضل رهان لك. لا يتم دعم واجهات معلومات العملية القياسية على OS X (تم توفير إصدارات NOOP في OS X 10.4 ، ولكن تمت إزالتها بعد ذلك) ومن المحتمل أن تتغير الواجهات الخاصة بين مراجعات OS X.

إذا كنت على استعداد لقفل نفسك في إصدار OS X واحد ، فكل المصدر متاح ، على سبيل المثال ملاحظة أو libproc; ؛ ستحتاج أيضًا إلى تشغيل الجذر.

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