macosx 10.9, detectando si un ejecutable se inicia a través de servicios de inicio

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

  •  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.

¿Fue útil?

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); }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top