Kalender
|
Juni '13 | |||||
| Mo | Di | Mi | Do | Fr | Sa | So |
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |

|
Juni '13 | |||||
| Mo | Di | Mi | Do | Fr | Sa | So |
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |

Geschrieben von Stefan Foerster in
Technik
Mittwoch, 4. April 2012
Ich hatte neulich schon einmal das "/proc"-Filesystem erwähnt, und natürlich kann man in Linux damit noch andere Sachen machen - z.B. STDOUT oder STDERR eines laufenden Prozesses umleiten (ein bißchen Hilfe braucht man allerdings dabei schon).
Schauen wir uns mal ein Beispiel an: Der folgende Prozess schreibt STDERR in das Terminal, indem wir ihn gestartet haben, und STDOUT nach "/tmp/foo":
Hilfreicherweise zeigt mir die Shell auch gleich die Prozess-ID an, so daß es ein leichtes ist, herauszufinden, wohin STDOUT (FD 1) und STDERR (FD 2) zeigen:
Es ist jetzt an der Zeit, den "GNU Debugger" zu bemühen. Wir "attachen" uns an die Prozess-ID 4767 und geben dem Debugger als "Hint" auch gleich noch mit, welches das Binary ist, das den Prozess erzeugt hat (wir kanonisieren diesen Namen hier noch, da "nc" unter Debian über eine Kette von Symlinks auf verschiedene Binaries zeigen kann):
Unser Ziel ist es nun, STDOUT zuerst zu schließen - worfür wir close(2) benutzen - und danach mit neuem Ziel zu öffnen - wofür wir creat(2) nutzen werden. Das geht eigentlich relativ einfach:
Mit der "p"-Funktion lassen wir uns den Rückgabewert von "close" auf den FD 1 - also STDOUT - anzeigen. Hier wird eine 0 zurück geliefert, es hat also alles funktioniert. Danach verwenden wir den gleichen Mechanismus, um die Datei "/tmp/bar" zu erzeugen, mit den Rechten "0644". Und tatsächlich:
Wenn wir schonmal im Debugger sind hätten wir übrigens noch Dutzend andere Sachen machen können - aus aktuellem Anlass sei hier mal gezeigt wie man herausfindet, welche "umask" ein laufender Prozess hat:
Der erste Aufruf von "umask" gibt uns als Ergebnis den Wert an, der bis zu diesem Aufruf aktuell war. In diesem Fall war das eine 18. Nach Oktal umgewandelt ergibt das '0022'. Mit dem zweiten "umask"-Aufruf setzen wir übrigens wieder den alten Wert - das sollte man nicht vergessen. In diesem Sinne!
Martin Berger - #1 - 05.04.2012 16:55 -
was passiert, wenn der Prozess zwischen dem p close(1) und dem p creat versucht zu schreiben?
Stefan - #1.1 - 05.04.2012 17:56 -
Sobald man sich mit gdb an den laufenden Prozess verbindet, wird dieser unterbrochen, deswegen kann das nie passieren. Wenn es also schnell gehen muß, dann ist der Parameter "-x" ganz hilfreich, mit dem man komplexere Skripte ausführen kann. Bekommt ein Prozess, während er unterbrochen ist, z.B. Daten via TCP, so werden diese bis zur maximalen Größe des TCP-Receive-Buffers vom Betriebssystem aufgehoben.
Zum Thema /proc und /sys sollte man eigentlich noch viel mehr schreiben - gesagt, getan. Fangen wir mal mit /sys an. Aufgabe Nummer eins, die ich jedes Mal wieder verplane: Man hat gerade irgendwo ne LUN ruasgeschnitzt, ein FC-Kabel angesteckt oder son
Aufgenommen: Apr 22, 14:23