[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: im Skript feststellen ob ein Verzeichnis leer ist



Frank Dietrich schrieb:

> wlt@bluewin.ch (Walter Saner) wrote:
> 
> >| wal@tek:~$ time ls -R -AU /usr/share | wc
> >|   51909   49256  737261
> >|
> >| real    0m0.546s
> 
> Das sind in meinem Fall hier beim erstem 'ls' 31.8 Sekunden.

Das erscheint mir doch ein büschen sehr lang. Die erste Ausführung
der obigen Pipe dauerte hier ca. 1.1 Sekunden. Und tek hat seine
besten Jahre schon lange hinter sich.

> >| wal@tek:~$ time ls -R -AU /usr/share | head -1 > /dev/null
> >|
> >| real    0m0.018s
> 
> 0.02 sek - perfekt (ich hätte es einfach probieren sollen)
> 
> Aber kannst Du mir erklären was da genau passiert? 

Der schreibende Prozess erhält das Signal SIGPIPE, wenn der lesende
Prozess die Pipe schliesst.

| wal@tek:~$ strace -e trace=signal ls -R -AU /usr/share | head -1
| rt_sigaction(SIGRTMIN, {0x401665d0, [], SA_SIGINFO}, NULL, 8) = 0
| rt_sigprocmask(SIG_UNBLOCK, [RTMIN], NULL, 8) = 0
| /usr/share:
| --- SIGPIPE (Broken pipe) @ 0 (0) ---
| +++ killed by SIGPIPE +++

> Ich war den Meinung alles was ls in die Pipe reinschreibt müsse auch
> wieder herausgelesen werden. Das scheint aber ja wohl dann nicht der

Wie willst du einen lesenden Prozess dazu zwingen - mit vorgehaltener
Waffe? ;-)

> Fall zu sein. Wie kommt also die Meldung vom head zu ls das es nicht
> weiter Daten liefern muß?

Das ist Sache des Kernels.


Ciao
Walter



Reply to: