macosx 10.9، اكتشاف ما إذا كان قد تم تشغيل الملف القابل للتنفيذ عبر خدمات الإطلاق

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

  •  20-12-2019
  •  | 
  •  

سؤال

قبل إصدار macosx 10.9، كان من الممكن اكتشاف ما إذا كان قد تم إطلاق ملف قابل للتنفيذ باستخدام خدمات التشغيل (finder، open, ، وما إلى ذلك) أو يتم استدعاؤه مباشرة على الجهاز من خلال البحث عن وجود ملف a -psn_* حجة في حجج البرنامج.

لم يعد هذا هو الحال في 10.9.هل هناك طريقة لاكتشاف ذلك في 10.9؟يبدو أنني أستطيع أن أنظر إذا cwd يكون / ولكن هذا ليس مضمونا حقا.

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

المحلول

أحاول أن أرى أنك طفل launchd قد تكون في الواقع الطريقة المعقولة للقيام بذلك ولكن الحل الذي أريده يجب أن يكون متحفظًا بشأن مكالمات النظام التي تستخدمها.

هنا طريقتان مختلفتان.أحدها هو التحقق مما إذا كان أحد واصفات الملفات القياسية هو tty (وهذا لن يعمل إذا تم إعادة توجيههم جميعًا).عينة من الرموز:

#include <unistd.h>

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
  if (isatty (STDIN_FILENO) || isatty (STDOUT_FILENO) || isatty(STDERR_FILENO))
  { printf ("tty launch\n"); fflush (stdout); }
  else
  { NSLog (@"Launch service"); }
}

والآخر هو البحث أيضًا إذا لم يتم تعيين متغير البيئة TERM أو for open تطلق، إذا كان متغير البيئة _ يكون /usr/bin/open):

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
  NSDictionary *env = [[NSProcessInfo processInfo] environment];
  NSLog(@"%@",env);
  NSString* term = [env objectForKey:@"TERM"];
  NSString* underscore = [env objectForKey:@"_"];

  if (!term || [underscore isEqualTo:@"/usr/bin/open"])
  { NSLog (@"Launch service"); }
  else
  { printf ("tty launch\n"); fflush (stdout); }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top