PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Non-Blocking FiFo (Named Pipe)



tomcom
23.05.16, 15:00
Hi,

ich würde gerne eine FiFo erstellen , die sich "wie eine Datei verhält".
Sie soll nach einem "echo" nicht blockieren. Bestehender Inhalt soll überschrieben werden.

Also wie z.B. so:


touch data
cat data

Ausgabe: LEERZEILE




touch data
echo a > data
cat data

Ausgabe: a





touch data
echo a > data
echo b > data
cat data

Ausgabe: b



Wie ging das ganze mit einer Named Pipe? Ich möchte in etwa so etwas realisieren:

mkfifio --my-secret-nonblobking-option data
Wichtig: echo und cat sollen nicht mit "&" in den Hintergrund gebracht werden.

Gruß,
Tom

nopes
23.05.16, 17:20
http://stackoverflow.com/questions/7360473/linux-non-blocking-fifo-on-demand-logging

Alternativ kannst du dich natürlich auch mit strace (http://man7.org/linux/man-pages/man1/strace.1.html) auf einen Prozess hängen, etwa so:


myApplication &
# dann irgendwann
strace -e all -s 10240 -p 1234 # 1234 muss der pid von myApplication entsprechen
#da -e all viel ausgibt und du dich vermutlich eher für Meldungen von der Anwendung interessierst, nehme lieber -e write (siehe man dazu)
strace -e write -s 10240 -p `pgrep myApplication`

BetterWorld
23.05.16, 17:31
Das geht nicht einfach so.
Entweder du lässt einen Prozess im Hintergrund laufen, oder du verwendest zwei Prozesse.
Eine FIFO ( mknod myFIFO p ) setzt einen Schreib- und ein Leseendpunkt voraus.

Wenn du das nicht willst, musst du dieses Verhalten simulieren:
# ein gemeinsam schreib/lesbare Datei
fifo="/dev/shm/myFIFOsimulation" # im Shared Memory
touch fifo # muss nicht sein.

# Schreibfunktion
wFifo(){
echo "$*" >> $fifo # alle Argumente einfach an die Fifodatei anhängen
}

# Lesefunktion
rFifo(){
sed -n '1p' $fifo # 1. Zeile ausgeben p == print
sed -i '1d' $fifo # 1. Zeile löschen d == delete

}
Das funktioniert solange NICHT beide Funktionen aufgerufen werden.
Kann gleichzeitiger Aufruf erfolgen, so ist noch ein Locking zu implementieren.

Zum Überschreiben einfach in der Schreibfunktion ein > weglassen.

tomcom
24.05.16, 16:02
Oder so:


cd /dev/shm
touch data
cat data

touch data
echo a > data
cat data

touch data
echo a > data
echo b > data
cat data
Mit cd /dev/shm geht alles wie gewünscht.

Danke