Domanda

Ecco la situazione: un processo scrive righe in un file FIFO (creato con mkfifo). Ad un certo punto nel mio programma, voglio leggere l'ultima riga nel FIFO, ed eliminare tutti gli altri. La procedura può bloccare, solo se v'è meno di una riga nella fifo.

Non riesco a trovare un modo pulito per fare questo, tutte le idee?

EDIT: Il processo di scrittura non potrà mai smettere di scrivere le linee nella FIFO, Cosa voglio dire con l'ultima linea è l'ultima per il momento ho letto la FIFO. Non è necessariamente seguita da un EOF.

È stato utile?

Soluzione

Se la vostra preoccupazione principale è che la lettura bloccherà quindi aprire il FIFO come non bloccante. Suppongo che tu sai quello che stai cercando in torrente e sarà semplicemente eliminare tutto prima.

Si può anche usare qualcosa come selezionare () per essere informato quando c'è qualcosa da leggere il tubo.

Altri suggerimenti

Se ho capito bene il problema, si dispone di un altro processo che alimenta il programma con i dati sopra il fifo, e nuovi dati obsoletes i dati precedentemente ricevuti, quindi siete interessati solo gli ultimi dati disponibili.

In questo caso il mio approccio sarebbe - modalità non-blocking impostato per il descrittore del fifo utilizzando bandiera O_NONBLOCK per fcntl() syscall, e usare qualcosa di simile a questo:

while (!exit_condition) {
    bytes = read(fd, wrkbuf, sizeof(wrkbuf));  // error handling omitted
    if (0 == bytes && bytes_to_process > 0) {
        process(wrkbuf, bytes_to_process);
        bytes_to_process = 0;
    } else
        bytes_to_process = bytes;
}

L'unico modo che posso pensare di fare questo implica avere il vostro programma (quella lettura) la lettura di tutte le informazioni contenute nel FIFO - cioè, il puntatore di lettura nel vostro programma è sempre alla fine del tubo. Quando un messaggio viene letto, si aggiungerà a un elenco interno di messaggi (vale a dire una coda o qualcosa di simile). Avrete anche mantenere un puntatore all'ultimo messaggio letto.

Leggendo l'ultima riga e scartando tutti gli altri, poi, è semplicemente il processo di seguire il puntatore l'ultimo messaggio e, se lo si desidera, si elimina la coda.

I problemi qui sono che il vostro coda interna potrebbe diventare grande, e che avrete bisogno di controllo della concorrenza per la coda e l'ultimo messaggio di puntatori. Avrei il lettore FIFO nel proprio thread fare nulla, ma l'ascolto della tubazione. Quando un messaggio arriva, è necessario bloccare la coda di, aggiungere il nuovo messaggio e aggiornare l'ultima puntatore messaggio, quindi rilasciare il blocco. Assicurati di elaborare tutti i messaggi in arrivo disponibili prima di rilasciare il blocco. Nel thread facendo la lavorazione, è necessario bloccare la coda di operare su di esso. Assicurarsi che si sta bloccando la coda per non più del necessario, o avrete problemi di prestazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top