[Megoldva] Program bemenete egy named pipe-n keresztül. Hogyan?

Fórumok

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!

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.

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.

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.