2010-07-11 20 views
1

J'essaye d'écrire un démon simple sous Linux, qui créera une FIFO, puis rassemblera tout ce qui est écrit dans le FIFO et écrira ces données dans un fichier plus tard.Vous avez du mal à faire fonctionner un FIFO Unix correctement?

Mes attentes sont qu'une fois que mon démon a créé le FIFO, je peux faire "echo text>/myfifo" à plusieurs reprises. Quand j'ai fini, je peux faire "echo quit>/myfifo" et mon programme va quitter et écrire toutes les données sur le disque.

J'utilise actuellement poll() pour savoir quand il y a plus de données sur le FIFO. Cela fonctionne bien jusqu'à la première fois que j'émets des données au FIFO. Les données sont bien écho, mais mon sondage retourne SIGHUP après cela.

Ai-je besoin de réinitialiser (ou fermer & rouvrir) le FIFO après que chaque processus lui écrit?

pseudo-code de mon code ressemble à ceci:

ret = fifo(my_fifo, mode); 
fd = open(my_fifo, O_RDONLY | O_NONBLOCK); 

polling.fd = fd; 
polling.events = POLLIN | POLLPRI; 

do { 
    ret = poll(&polling, 1, -1); 
    amt = read(fd, buf, bufsize); 
    // do stuff 
} while (!done); 

Répondre

2

Vous devez garder la réouverture du FIFO, je pense. Je un programme qui surveille une FIFO, et la boucle de contrôle est la suivante:

/* Implement monitor mode */ 
void sql_monitor(char *fifo) 
{ 
    if (chk_fifo(fifo) != 0) 
     cmd_error(E_NOTFIFO, fifo); 

    /* Monitor -- device is assumed to be a FIFO */ 
    while (1) 
    { 
     ctxt_newcontext(); 
     if (ctxt_setinput(fifo) != 0) 
      sql_exit(1); 
     sql_file(); 
     ctxt_endcontext(); 
    } 
} 

La fonction ctxt_newcontext() cache profondément l'état d'E/S en cours; la fonction ctxt_setinput() définit le fichier d'entrée dans le fichier nommé - une FIFO dans ce cas. La fonction sql_file() lit le fichier (FIFO) jusqu'à ce que la fin soit atteinte - le fichier est fermé. Le ctxt_endcontext() défait ce que fait ctxt_newcontext(). Le processus se répète ... Ce code a été autour depuis environ 1990.

Ainsi, OUI, vous aurez besoin de garder la fermeture et la réouverture du FIFO après avoir lu la fin du fichier (après chaque processus tels que echo finitions écrire au FIFO).

(Notez également qu'il n'est pas nécessaire d'interroger la mémoire FIFO à moins que le processus ne fasse autre chose en l'absence de données.) L'appel read() attendra jusqu'à ce qu'il y ait des données avant de retourner.

+0

Oui, FIFO doit être rouvert. Beaucoup oublient qu'en mode synchronisation, l'ouverture FIFO bloquerait jusqu'à ce que l'autre côté de la communication l'ouvre aussi. C'est pour le rendre utilisable par exemple. redirections de shell. Donc, d'une certaine manière, il se comporte comme une connexion. – Dummy00001