awk a jiny program

Alexandr Malusek malusek na hroch.ujf.cas.cz
Pondělí Únor 12 11:29:45 CET 2001


hampl na gncz.cz (pavel hampl) writes:

> > > nevi nekdo z vas, jestli je mozne v awk zavolat program a zaroven do
> > > nej posilat text i brat jeho vystup?
> > 
> > Da se to udelat pres pojmenovane roury (named pipes), ale to neni
> > zadna specialni vlastnost AWK.
> > 
> 
> Pres pojmenovane roury umim odesilat vicenasobny vystup NEBO cist
> vicenasobny vstup (tedy vice radek), ale ne OBOJI najednou.

Za urcitych predpokladu lze pouzit napr. konstrukci

BEGIN {
    system("rm -f fifo1 fifo2");
    system("mkfifo fifo1 fifo2");
    system("tr '[:lower:]' '[:upper:]' < fifo1 > fifo2 &");
    print "hello world" > "fifo1";
    close("fifo1");
    getline < "fifo2";
    print $0;
}

$ awk -f file.awk
HELLO WORLD

Problem je s blokovanim procesu - vystup prikazu print musi byt
dostatecne maly, aby se vesel do FIFO. Prenositelnejsi a bezpecnejsi
je pouziti docasneho souboru.

> command="jmeno prikazu s parametry"
> print cokoli | command | getline

Problem je nasledujici: 
1. print zaplni rouru 1, system proces zablokuje.
2. command precte vstup, vygeneruje data, ktera zaplni rouru 2,
   a system ho zablokuje
3. system odblokuje puvodni print, ten znovu zaplni rouru 1 a system
   ho zablokuje

System ale uz neodblokuje command, protoze jeho vystupni roura 2 je
plna. Vysledkem jsou dva zablokovane procesy.

Zaver: Obousmerna komunikace se pouzit da, ale jen za urcitych
predpokladu. AWK pro to neni vhodny nastroj. Vhodnejsi je napr. perl,
jak uz bylo zmineno. Jistou podporu ma i Korn shell.

--
A. Malusek  (malusek na ujf.cas.cz)
UJF AV CR


Další informace o konferenci Linux