9
votes

Assurez-vous qu'un sous-processus est mort dans le cacao

J'écris une application qui élimine un sous-processus exécutant un serveur Web simple. J'utilise Nstask et communiquer avec elle avec des tuyaux et tout semble plus ou moins bien. Toutefois, si mon programme se bloque, le sous-processus est laissé en vie et la prochaine fois que je lance l'application, il existe un conflit entre l'ancien sous-processus et le nouveau. Y a-t-il un moyen de s'assurer que les sous-processus meurent lorsque la possession de l'application meurt?


3 commentaires

Avez-vous essayé de faire votre programme pas de crash? :RÉ


Je pense à Atlas ici ^^


Vous pouvez essayer d'exécuter le serveur Web dans launchd. De cette façon, lorsque votre application se bloque et que vous relancez, LANCHND vous dira que le serveur est déjà en cours d'exécution afin que vous puissiez la fermer et le redémarrer si vous le souhaitez.


5 Réponses :


1
votes

Votre délégué de l'application peut implémenter le message

- (void)applicationWillTerminate:(NSNotification *)aNotification
  • Arrêtez une sous-processus existante et orphelinée lors du lancement d'un nouveau processus parent en écrivant sur le disque du PID de la sous-processus sur la création et en le supprimant pendant une fermeture normale (parfois pas le comportement le plus sûr). LI>
  • Arrêtez le sous-processus Si le point final de Nspipe n'a pas envoyé de données pour une durée spécifique (quelque chose comme un battement de coeur). Li> ul> p>


0 commentaires

0
votes

Mise à jour: Maintenant que je vais vérifier cela correctement ça ne fonctionne pas. Essayer de définir le groupe de processus échoue avec cette erreur;

Eperm "L'ID utilisateur efficace du processus demandé est différent de celui de l'appelant et le processus n'est pas un descendant du processus d'appel." P>

Il existe un fil plus récent sur cette question, mais pas de solution facile autant que je puisse dire p>

http://www.omnigroup.com/mailman/archive/macosx-dev/2009-march/062164.html P>


J'ai essayé une suggestion de Robert Pointon sur Cocoadev dans mon application. Je n'ai pas encore de tester cependant. P>

http: / /www.cocoadev.com/index.pl?nstasktermination p>

L'idée est de définir le groupe de processus de la tâche pour être identique à celle du processus qui lance la tâche (note: Le code ci-dessous est essentiellement soulevé du fil ci-dessus). P>

    pid_t group = setsid();
    if (group == -1) {
        group = getpgrp();
    }

   [task launch]; 


if (setpgid([task processIdentifier], group) == -1) {
   NSLog(@"unable to put task into same group as self");
   [task terminate];
} else {
// handle running task
}


0 commentaires

2
votes

Aucune des œuvres ci-dessus ne fonctionne même ... pas launchd dans tout ce qu'elle est documentée-documenté-complexité a un moyen de gérer ce scénario commun. Je ne sais pas pourquoi Apple ne fait que faire une manière "approuvée par les mères" pour exécuter des processus d'arrière-plan, mais peu importe ma solution ...

  1. Lancez un script Shell via NSTASK et transmettez-le des variables dont vous avez besoin. passe également dans votre processus parent 'PID via int MasterPid = [[[[NSProcessInfo processInfo] ProcessIdentifier]; Les lire dans votre script via 1 $, 2 $, etc.

  2. à son tour, lancez vos sous-processus de à l'intérieur du script ..

  3. surveillez à la fois le sous-processus et votre processus parent dans le script.

    Ceci sert un double but .. Cela vous permet de "garder un œil sur les enfants", et dans le triste événement de parentcide (ou d'un horrible accident de voiture) - tuer les orphelins zombies . Ensuite, vous tirez la gâchette sur vous-même ( vous étant le script shell ) et votre table de processus sera propre. comme si vous n'avez jamais existé . Pas de ports bloqués, pas de conflits sur Relaunch, pas de rejets de magasin d'applications. Lemme sais si cela aide!

    Mise à jour: J'ai fait un modèle Xcode / démon / projet / quel que soit le tour. Vérifiez-le .. mraalexgray / infanticide.


0 commentaires

1
votes

Après le code de code devrait vous aider.

Il est emprunté à ici , xxx


0 commentaires

0
votes

Il y a - [nsconcretetetak SetStartsNewProcessgroup:] API privé, si vous passez non , puis créé NSTASK instance ne détachera pas le processus enfant de la groupe de processus du processus en cours, et il mourra dès que le processus parent meurt.

Kudos à xctool: https://github.com/facebook/xctool/pace / 159 / Fichiers


0 commentaires