2012-02-09 49 views
5

Mam nadzieję, że robię coś złego, ale wygląda na to, że kdb nie może odczytać danych z nazwanych potoków (przynajmniej w systemie Solaris). Blokuje, dopóki nie zostaną zapisane, ale potem nie zwraca żadnych danych, które zostały zapisane.Czy można odczytać kdb z nazwanego potoku?

mogę utworzyć plik tekstowy:

$ echo Mary had a little lamb > lamb.txt 

i KDB chętnie czytać go:

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

mogę utworzyć nazwanego potoku:

$ mkfifo lamb.pipe 

i próbuje odczytać z tego:

q) read0 `:/tmp/lamb.pipe 

spowoduje zablokowanie kdb. Pisząc na rurze:

$ cat lamb.txt > lamb.pipe 

spowoduje KDB powrócić pustą listę:

() 

Czy KDB odczytu z nazwanych potoków? Czy powinienem po prostu zrezygnować? Nie sądzę, że jest to kwestia uprawnień (próbowałem ustawić -m 777 na mojej komendzie mkfifo, ale to się nie zmieniło).

Odpowiedz

0

Algorytm read0 nie jest dostępny, aby zobaczyć, co robi pod maską, ale, o ile mogę stwierdzić, oczekuje strumienia skończonego, a nie ciągłego; więc będzie blokować, dopóki nie otrzyma sygnału EOF.

+0

Cieszę się, że blokuje - to wydaje się prawidłowe zachowanie dla ciągłego strumienia - ale potem zwraca pustą listę, a nie dane, które zostały napisane. Wygląda prawie tak, jakby czekał na EOF, a następnie wyrzucił wszystko, co przeczytał przed tym punktem: s –

+0

Tak, może to oznaczać, że upłynął czas. Podstawowy algorytm dostarczyłby odpowiedzi, więc warto wysłać wiadomość e-mail na adres [email protected], aby uzyskać jasność co do sytuacji. – algolicious

2

po niepowodzeniu read0, możesz często podrobić go za pomocą system"cat ...". (Znalazłem to pierwotnie kiedy próbuje odczytać rzeczy z katalogu/proc, który również nie współpracować z read0.)

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

tylko mieć świadomość, że jest to dość wysoko nad głową (jak takie rzeczy idą w q) dla powołując system - ikra cały proces powłoki po prostu uruchomić niezależnie od poleceń jest

może również być w stanie to zrobić bezpośrednio z custom C extension, prawdopodobnie wzywając read(2) bezpośrednio ...

4

z uwolnieniem kdb+ v3.4 Q posiada wsparcie dla nazwanych potoków: w zależności od czy y ou chcą zaimplementować algorytm strumieniowego lub po prostu czytać z rury użyć .Q.fps lub read1 na rurze fifo:

wdrożyć strumieniowe można zrobić coś takiego:

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

Następnie $ cat lamb.txt > lamb.pipe

będzie wydrukować

"Mary miała małą owieczkę"

w twojej q sesji. Bardziej znaczące algorytmy można wdrożyć, zastępując 0N! odpowiednią funkcją.

Aby przeczytać kontekst pliku do zmiennej zrobić:

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

"Mary miała małą owieczkę \ n"

Zobacz więcej na temat nazwanych potoków here.

Powiązane problemy