Sziasztok!
Szeretnék egy olyat megcsinálni, hogy egy program a futása alatt kaphasson named pipe-on keresztül bemeneti értékeket.
Alap értelmezésben a program, legyen X, az alábbi szkripttel indul, ahol a bemenet egy input nevű fájl, amely soronként tartalmazza a program számára a bemeneteket:
#!/bin/bash
./X -bemeneti_file input
Tehát ha van egy konkrét fájl, akkor arra működik is a program. De sok sora van a bemenetnek és jó lenne esetlegesen már futás közben változtatni a bemeneten.
Erre tudom, hogy van a named pipe.
Létre is hozok egy named pipe-ot az mkfifo input paranccsal.
Ezek után ha jól értelmeztem az interneten olvasottakat, ha van egy szkriptem, ami az input pipe-ba ír, akkor az elvileg mint egy csövön, továbbmegy X program felé.
Ezen a linken: http://www.linuxjournal.com/content/using-named-pipes-fifos-bash
le is írják, hogyan kell ezt csinálni.
De az a probléma, hogy az X program indulásakor rögtön bemenetre vár és akkor ha csak egy üres named pipe-ot talál,nem lesz jó a működése.
Tehát kérdésem az, hogy hogyan lehet azt elérni, hogy várjon a program mindaddig, amíg az input pipe-ba adat érkezik?
Egyáltalán a program módosítása nélkül egy scripttel ez elérhető?
Minden segítséget nagyon köszönök!
- 1016 megtekintés
Hozzászólások
Szerintem az a tuti megoldás, hogy az X programban felveszel a signal handlert, ami olvas a pipeból, és ha adatot küldtél bele, akkor triggereled az olvasást. Egyrészt erőforráskímélő, másrészt sosem fog olvasni, ha nincs adat.
Mellesleg nem kellene egyszerűen blokkolódnia a read pipe-ra, míg nem érkezik adat? Szerintem valami szőr van a palacsintában.
- A hozzászóláshoz be kell jelentkezni
Ezt a blokkolódást ki tudnád fejteni?
Tehát alapból egy file-t olvas be, ott nem kell, hogy blokkolódás legyen, mert az a fájl kész van.
- A hozzászóláshoz be kell jelentkezni
RTM, azaz man 7 pipe:
If a process attempts to read from an empty pipe, then read(2) will block until data is available. If a process attempts to write to a full pipe (see below), then write(2) blocks until sufficient data has been read from the pipe to allow the write to complete. Non-blocking I/O is possible by using the fcntl(2) F_SETFL operation to enable the O_NONBLOCK open file status flag.
- A hozzászóláshoz be kell jelentkezni
Ez nálam megy, nem ezt akarod?
mkfifo fifo
(while read; do echo $REPLY | rev; done < fifo)&
cat > fifo
Van valami megszorítás Linux-szal, hogy egy rendszeren kell fusson a fifo-író és -olvasó processz.
egyébként X név már foglalt :)
~~~~~~~~
De ezt az egy lépést ki nem tevé,
Az nem tett semmit, nem tud semmit is.
- A hozzászóláshoz be kell jelentkezni