Cum pot țeavă de ieșire a unui program care se poate scrie doar într-un fișier (și nu la STDOUT)?

voturi
4

Am încercat să scriu ceva de genul Perl Audio Converter , așa că trebuie să fie în măsură să decodeze orice format audio relevant pentru wav (PCM) și apoi codifica wav la fiecare format audio relevante. Aș vrea să fac acest lucru în paralel, prin conducte ieșirea decodorul direct la intrarea codorului. Cele mai multe decodoare au o opțiune de a decoda la stdout, dar nu toate dintre ele fac. Unii insista pe un fișier pentru a scoate.

Deci, întrebarea mea este, cum pot păcăli un program care va ieșire doar într-un fișier specificat în utilizarea stdout în loc? De asemenea, întrebarea complementară: cum pot păcăli un program care necesită în fișierul de intrare în lectură de la stdin?

Ar fi imposibil acest lucru, deoarece programul ar putea dori să caute înainte și înapoi în ieșire?

De altfel, Perl Audio Converter sidesteps această problemă întotdeauna utilizând un fișier wav intermediar, ceea ce înseamnă că nu o face decodare și codificare în paralel, chiar și pentru formatele care îl suportă.

PS: Da, există un motiv pentru care nu vreau să utilizați doar Perl Audio Converter, dar nu este relevantă pentru întrebare.

Întrebat 22/11/2009 la 00:57
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
3

Pe Linux, puteți da /proc/self/fd/1ca un „fișier“ de ieșire.
Acest lucru ar trebui să funcționeze pentru orice program care nu încearcă să caute în ieșire.

Unele programe caută în producția (de exemplu, pentru a scrie informatii rezumat la începutul fișierului o dată de decodare este completă), iar acest lucru nu va reuși să caute cu nimic altceva decât un fișier reală.

În cazul în care programul verifică valoarea returnată fseeksau lseek(așa cum ar trebui), programul va reveni probabil o eroare. Dacă nu, va ieși probabil cu succes, dar va crea ieșire eronată ( de exemplu , cu informații incorecte rezumat la început, și în plus „junk“ , la sfârșitul anului ).

Publicat 22/11/2009 la 01:02
sursa de către utilizator

voturi
3

Unele sisteme de operare, cum ar fi variantele Unix si familia win32, suport conducte numit . S-ar putea fi în măsură să le folosească în loc de stdout / stdin.

Publicat 22/11/2009 la 01:06
sursa de către utilizator

voturi
2

Faceti o țeavă pe nume.

mkfifo /tmp/mypipe

În loc de a face de exemplu

echo foo | wc -c 

îl puteți folosi ca un fișier

echo foo > /tmp/myfifo &
wc -c /tmp/myfifo

(Oricare dintre acestea este pornit mai întâi se va bloca până când se deschide celălalt capăt al țevii) Dar ai dreptate, în cazul în care programul are nevoie de fapt un fișier de exemplu, căutarea, acest lucru nu va funcționa.

Publicat 22/11/2009 la 01:09
sursa de către utilizator

voturi
1

Creați o țeavă de ieșire și alocați la conducta

Publicat 22/11/2009 la 01:11
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more