macosx 10.9,检测是否通过启动服务启动了可执行文件

时间:2014-07-29 09:21:55

标签: macos osx-mavericks

在macosx 10.9之前,可以检测是否使用启动服务(finder,open等)启动了可执行文件,或者通过查找-psn_*参数的存在直接在终端上调用在程序参数中。

10.9不再是这种情况。有没有办法在10.9中检测到?我似乎可以看cwd/,但这并非万无一失。

1 个答案:

答案 0 :(得分:2)

试图看到你是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未设置,或者对于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); }
}