2012-02-09 7 views
5

Spero di fare qualcosa di sbagliato, ma sembra che kdb non possa leggere i dati dalle pipe denominate (almeno su Solaris). Blocca fino a quando non viene scritto, ma non restituisce nessuno dei dati che sono stati scritti.È possibile leggere kdb da una pipe denominata?

posso creare un file di testo:

$ echo Mary had a little lamb > lamb.txt 

e KDB felicemente leggerlo:

q) read0 `:/tmp/lamb.txt 
enlist "Mary had a little lamb" 

posso creare una named pipe:

$ mkfifo lamb.pipe 

e cercando di leggere da esso:

q) read0 `:/tmp/lamb.pipe 

causerà il blocco di kdb. Scrivendo al tubo:

$ cat lamb.txt > lamb.pipe 

causerà KDB per tornare alla lista vuota:

() 

Può KDB leggere da named pipe? Dovrei semplicemente arrendermi? Non penso sia una cosa delle autorizzazioni (ho provato a impostare -m 777 sul mio comando mkfifo ma questo non ha fatto differenza).

risposta

0

L'algoritmo per read0 non è disponibile per vedere cosa sta facendo sotto il cofano ma, per quanto posso dire, si aspetta un flusso finito e non uno continuo; quindi bloccherà fino a quando non riceverà un segnale EOF.

+0

Sono contento che blocchi - sembra il comportamento corretto per un flusso continuo - ma restituisce quindi la lista vuota, anziché i dati che sono stati scritti. È quasi come se stesse aspettando EOF e poi buttasse via qualsiasi cosa leggesse prima di quel punto: s –

+0

Sì, potrebbe essere il momento giusto. L'algoritmo sottostante fornirebbe la risposta, quindi potrebbe valere la pena di inviare un'e-mail a [email protected] per ottenere chiarezza sulla situazione. – algolicious

2

quando read0 non riesce, è possibile simulare frequentemente con system"cat ...". (Ho trovato questo in origine quando si cerca di leggere roba da/proc che anche non collabora con read0.)

q)system"cat /tmp/lamb.pipe" 
<blocks until you cat into the pipe in the other window> 
"Mary had a little lamb" 
q) 

basta essere consapevoli c'è un ragionevolmente alte spese generali (come tali vanno le cose in q) per invocare system - si genera un intero processo di shell solo per eseguire qualunque sia il vostro comando è

si potrebbe anche essere in grado di farlo direttamente con un custom C extension, probabilmente chiamando read(2) direttamente ...

4

con la versione kdb+ v3.4 Q ha il supporto per named pipe: a seconda se y ou vogliono implementare un algoritmo in streaming o semplicemente letta dal tubo di utilizzare .Q.fps o read1 su un tubo fifo:

Per implementare lo streaming si può fare qualcosa di simile:

q).Q.fps[0N!]`:lamb.pipe 

Poi $ cat lamb.txt > lamb.pipe

volontà stampare

, "Mary aveva un agnellino"

nella sessione q. Algoritmi più significativi possono essere implementati sostituendo 0N! con una funzione appropriata.

Per leggere il contesto del file in una variabile fare:

q)h:hopen`:fifo://lamb.pipe 
q)myText: `char$read1(h) 
q)myText 

"Mary aveva un agnellino \ n"

vedere di più su named pipe here.

Problemi correlati