2010-01-15 3 views
1

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.

+0

Vous devriez publier du code sur * comment * vous avez créé les fichiers temporaires et le répertoire "[pid of a]". – AndiDog

+0

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

+0

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

Répondre

3

Je ne peux pas répondre à la raison pour laquelle le fichier pipe est supprimé, pas assez d'informations.

Je peux répondre à la question de savoir pourquoi le programme fonctionne toujours. Dans unix, la suppression du nom d'un fichier d'un répertoire ne supprime pas le fichier. Le fichier n'est supprimé que lorsqu'il n'y a plus d'entrées de répertoire et que le fichier n'est pas utilisé par un programme.

+0

+1 - vous me battez dessus – kdgregory

+0

Ok, merci pour ça. Explique une chose au moins. –

0

En unix, le noyau conserve un compte de référence sur tous les fichiers ouverts - si vous ouvrez un fichier, que les augmentations de comptage de référence, et lorsque vous fermez ce fichier, il diminue. Le nombre structure de fichiers dans le noyau reste valable jusqu'à ce que la référence tombe à 0. Retrait du tuyau du système de fichiers empêche les nouveaux processus d'ouverture du fichier, mais les processus qui ont le fichier déjà ouvert peut continuer à l'utiliser, non affecté par la suppression des fichiers .

Questions connexes