cat timeout, named pipe

Sziasztok!

Szeretnék timeout-os cat parancsot csinálni.
Pontosabban szeretném ha cat egy named pipe kiolvasása után visszatérne és nem blokkolna.
példa:


mkfifo /tmp/named.pipe 2>/dev/null
exec 12<> /tmp/named.pipe
echo 'hello world' >&12
echo 'second line' >&12
cat <&12

Ameddig eljutottam:
egy sort ki tudok olvasni:
ha a cat helyett


TEMP=''
read -t 1 TEMP <&12
echo "$TEMP"

használok
épp ezt próbálom ciklusban meghívni, de kiváncsi vagyok hátha van egyszerűbb megoldás

Előre is köszi

Hozzászólások

dd bs=16k count=1
vagy valami ilyesmi szerintem jó lesz. A dd-t egy darab jó nagy blokk olvasására kéred meg, ő beolvas annyit amennyit tud és boldogan visszatér egy csonka blokkal. A 16k nagyobb, mint amennyi a pipe pufferébe egyszerre belefér (asszem). Ha egyszeri adat vár kiolvasásra, azzal ez megoldható. Ha az író folyamatosan ír, vagy nem tudod hogy mikor végez, akkor úgysem úszod meg a ciklust. Named pipe-on (az "igazi" név nélküli pipe-tól eltérően) nincs EOF, nem látod hogy aki ír bele az mikor zárja le ezt a fájlleírót.

Szerk: a dd tippem szerint beblokkol, ha egyetlen árva byte sem vár rá. Valszeg conv=noblock segít ezen.

Ezaz, ezt kerestem :)


cat_timeout()
{
	dd bs=64k count=1 iflag=nonblock 2>/dev/null
}

pipe(7) szerint a méret 64k:
"In Linux versions before 2.6.11, the capacity of a pipe was the same as the system page size (e.g., 4096 bytes on x86).
Since Linux 2.6.11, the pipe capacity is 65536 bytes."

Köszönöm szépen a tippet.

A read-del és ciklussal megvalósított timeout cat:


#!/bin/bash
# named pipe read/write

cat_timeout()
{
	if [ $# -lt 1 ] ; then
		CAT_TIMEOUT_TIME=1     # default timeout value
	else
		CAT_TIMEOUT_TIME="$1"  # timeout is specified with argument
	fi
	CAT_TIMEOUT_TEMP='1'
	CAT_TIMEOUT_TOTAL=""
	while [ "$CAT_TIMEOUT_TEMP" != "" ] ; do
		CAT_TIMEOUT_TEMP=""
		read -t "$CAT_TIMEOUT_TIME" CAT_TIMEOUT_TEMP
		if [ "$CAT_TIMEOUT_TOTAL" != "" ] ; then
			CAT_TIMEOUT_TOTAL=`printf '%s\n%s' "$CAT_TIMEOUT_TOTAL" "$CAT_TIMEOUT_TEMP"`
		else
			CAT_TIMEOUT_TOTAL="$CAT_TIMEOUT_TEMP"
		fi
	done
	echo "$CAT_TIMEOUT_TOTAL"
}

mkfifo /tmp/named.pipe 2>/dev/null

exec 12<> /tmp/named.pipe

echo 'hello world' >&12
echo 'second line' >&12

cat_timeout <&12 

Az expect-tel jaro pelda a 'timed-run', ime:


#!/usr/bin/expect -f
# run a program for a given amount of time
# i.e. time 20 long_running_program

set timeout [lindex $argv 0]
eval spawn [lrange $argv 1 end]
expect

aztan


./timed-run 5 cat /tmp/fifo