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? P>
5 Réponses :
Votre délégué de l'application peut implémenter le message
- (void)applicationWillTerminate:(NSNotification *)aNotification
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 }
Aucune des œuvres ci-dessus ne fonctionne même ... pas Lancez un script Shell via NSTASK et transmettez-le des variables dont vous avez besoin. passe également dans votre processus parent 'PID STRY> via à son tour, lancez vos sous-processus de à l'intérieur du script em> .. p> li>
surveillez à la fois le sous-processus et strong> votre processus parent dans le script. p> li>
ol>
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 fort>. Ensuite, vous tirez la gâchette sur vous-même ( vous étant le script shell em>) et votre table de processus sera propre. comme si vous n'avez jamais existé em>. Pas de ports bloqués, pas de conflits sur Relaunch, pas de rejets de magasin d'applications. Lemme sais si cela aide! P>
launchd code> 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 ... p>
int MasterPid = [[[[NSProcessInfo processInfo] ProcessIdentifier]; code> Les lire dans votre script via 1 $, 2 $, etc. p> li>
Il y a Kudos à xctool: https://github.com/facebook/xctool/pace / 159 / Fichiers P> - [nsconcretetetak SetStartsNewProcessgroup:] code> API privé, si vous passez
non code>, puis créé
NSTASK code> 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. P>
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.