macosx 10.9, detectando si un ejecutable se inicia a través de servicios de inicio
-
20-12-2019 - |
Pregunta
Antes de macOSx 10.9 era posible detectar si un ejecutable se iniciaba usando los servicios de inicio (finder, open
, etc.) o invocado directamente en el terminal buscando la presencia de un -psn_*
argumento en los argumentos del programa.
Este ya no es el caso en 10.9.¿Hay alguna forma de detectar eso en 10.9?Parece que puedo mirar si cwd
es /
pero eso no es realmente infalible.
Solución
Tratando de ver que eres un hijo de launchd
En realidad, puede ser la forma más sensata de hacerlo, pero la solución que quiero debe ser conservadora en cuanto a las llamadas al sistema que utiliza.
Aquí hay dos enfoques diferentes.Una es verificar si uno de los descriptores de archivos estándar es un tty (aunque eso no funcionará si todos se redirigen).Código de muestra:
#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"); }
}
el otro es también mirar si la variable de entorno TERM no está configurada o, por ejemplo open
se inicia, si la variable de entorno _
es /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); }
}