在macosx 10.9之前,可以检测是否使用启动服务(finder,open
等)启动了可执行文件,或者通过查找-psn_*
参数的存在直接在终端上调用在程序参数中。
10.9不再是这种情况。有没有办法在10.9中检测到?我似乎可以看cwd
是/
,但这并非万无一失。
答案 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); }
}