J'ai 2 programmes, écrits en Java. Le premier lance plusieurs instances de la seconde et communique ensuite avec eux via des fichiers pipe. Lors de l'exécution de 2 instances du programme, (je vais appeler le lanceur A et les autres B et C) tout fonctionne bien. Les fichiers pipe sont dans/tmp/[pid de A]/B et/tmp [pid de A]/C. Si B ou C se ferme alors les autres devraient continuer à fonctionner, ce qui est le cas sauf que le dossier/tmp/[pid of A] disparaît complètement.Le fichier de tuyau disparaît mais fonctionne toujours
L'autre programme détecte cela et essaie de se fermer car il ne devrait pas fonctionner sans les fichiers pipe. Mes questions sont les suivantes: pourquoi continue-t-il de fonctionner si les fichiers de tuyaux sont partis? et pourquoi disparaissent-ils en premier lieu?
Si C se ferme, A et B continuent à fonctionner. Le seul code qui s'exécute est System.exit(0);
et à l'exception des messages de processus reçus des canaux A ne fait rien.
EDIT:
Comme par demande le code qui crée le répertoire et les tuyaux.
File dir = new File("/tmp/" + pid);
dir.mkdirs();
File aDir = new File(dir, "A");
aDir.mkdirs();
File bDir = new File(dir, "B");
bDir.mkdirs();
Runtime.getRuntime().exec(new String[] {"mkfifo", PIPE_NAME}, null, aDir);
Runtime.getRuntime().exec(new String[] {"mkfifo", PIPE_NAME}, null, bDir);
Le code actuel est un peu plus complexe mais c'est l'idée de base.
Lorsque le programme se ferme.
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
lecture et l'écriture des fils se fait dans son propre thread traitant comme un fichier normal en utilisant des objets BufferedReader et BufferedWriter.
Vous devriez publier du code sur * comment * vous avez créé les fichiers temporaires et le répertoire "[pid of a]". – AndiDog
Vous devez poster un code. Et que voulez-vous dire par "fichiers de tuyaux"? La façon dont vous les décrivez, vous n'utilisez pas un tube shell ou un tube OS. Affiche le code exact que vous utilisez pour créer ces fichiers et le code exact que vous exécutez lorsque B ou C est arrêté. – kdgregory
Je pensais juste que je vérifierais que A ne faisait rien quand C fermait. J'ai couru A dans le débogueur et après avoir commencé B et C mis en pause tous les threads en cours d'exécution dans A, puis fermé C. La même chose s'est produite. –