2009-05-29 11 views
2

Deux exécutables C existent A et B. A et B communiquent entre eux par l'intermédiaire d'une douille.Créer un nouveau processus indépendant à partir d'un autre processus C

B peut être démarré de manière indépendante ou par A.

  1. Si B est démarré en premier et A est commencé suivante, puis A et B commencent correctement sans problèmes. Même si A est redémarré, il n'y a aucun problème.

  2. Si B est démarré par A, alors A et B démarre correctement. Mais ici le port de communication est lié à A et B. Ici, si A est redémarré, alors A ne démarre pas.

Puisque B est démarré par A, procédé A est le parent de traitement B.

Ainsi, est-il des moyens par lesquels le procédé B peut être démarré indépendamment dans le procédé A?

Nous avons essayé d'utiliser fork, mais avec fork lorsque nous essayons de démarrer l'exe, deux processus sont en cours au lieu d'un.

Répondre

3

Avez-vous essayé d'utiliser un exécutable 'wrapper' qui double deux fois - une fois pour A et une fois pour B - et se tue ensuite? Cela aurait A et B en vie en tant que processus séparés qui sont ensuite hérités par le processus d'initialisation, et devrait être redémarré en toute sécurité.

0

Etes-vous sûr de vérifier correctement la valeur de retour de fork()?

Comme:

pid_t pid; 
if (pid == 0) { 
    /* child */ 
} 
else if (pid > 0) { 
    /* parent */ 
} 
else { 
    /* error */ 
} 
0

Utilisez-vous un socket de domaine Unix ou une prise réseau régulier?

Lequel des processus, A ou B, écoute sur la socket (passive open), et qui fait l'ouverture active?

Lorsque vous décidez que A doit exécuter B, comment le code détermine-t-il que cela est nécessaire?

Êtes-vous ouvrir le socket avant vous fork et exec?

Mon impression à partir des informations données est:

  • Vous utilisez une prise réseau
  • B est l'auditeur

Mais je pourrais facilement être confondu. Je me demande si vous rencontrez des problèmes car A a déjà créé le socket actif avant fork et exec B, donc la fin active du socket n'est pas fermée proprement quand A se termine car B a une copie du socket ouverte pour L'écriture ainsi que A. Lorsque vous fork, le processus enfant doit nettoyer les descripteurs de fichiers inutiles (tels que les sockets) avant d'exécuter un autre processus.

Questions connexes