CGI-Skripte sind Skripte, die auf einem Webserver laufen und dort dynamisch
Webinhalte, normalerweise HTML-Seiten, erzeugen. CGI-Skripte können
Benutzereingaben aus HTML-Formularen verarbeiten.
CGI-Skripte werden gerne in Perl geschrieben, weil Larry Wall so ein netter
Mensch ist oder einfach weil man in Perl sehr einfach Strings verarbeiten
und mit Dateien umgehen kann.
Perl ist eine Skriptsprache, die vor allem wegen der kryptischen, aber
mächtigen Regulären Ausdrücke gefürchtet ist. Hat man die
einmal verstanden, wird man Perl schnell nicht nur für Web-Seiten
verwenden, sondern auch zum Parsen, Durchsuchen, Formatieren und Konvertieren
von Text, Quellcode usw.
Unter Unix, wenn sie als ausführbar markiert ist, z.B. mit
chmod [augo]+x <Datei>
. Unter Windows muss eine
Ausführbar, wenn Sie die Endung .exe hat.
C++ | C | File Handle | |
Eingabe | cin | STDIN_FILENO | 0 |
Ausgabe | cout | STDOUT_FILENO | 1 |
Fehler | cerr | STDERR_FILENO | 2 |
Eingabeumleitung:
Die Standardeingabe (das, was normalerweise auf der Tastatur eingegeben wird)
kommt aus einer Datei. Beispiel:
sort < Dateigibt Datei sortiert am Bildschirm aus
Ausgabeumleitung:
Die Standardausgabe wird in eine Datei umgeleitet. Davon gibt es allerdings
zwei: die Standardausgabe (cout) und die Standardfehlerausgabe (cerr).
will man beispielsweise diese html-Seite sortieren und das Ergebnis in eine
Datei schreiben, lautet der Befehl:
sort < index.html > totales_chaos.htmlOder man ist der vielen Fehlermeldungen überdrüssig und schickt mit
befehl 2> /dev/nullalle Fehlermeldungen ins Nirvana.
Ein Filter filtert die Standardausgabe. Zum Beispiel kann man die Ausgabe von ls sortieren lassen:
ls | sortoder bei der Ausgabe von ls alle as durch es ersetzen:
ls | perl -p -e 's/a/e/g;'
Ein Pipe ist ein Kommunikationskanal zwischen verwandten Prozessen. Es gubt
zwei verschiedene Arten von Pipes: benannte und unbenannte. Unbenannte Pipes
werden mit dem Systemaufruf pipe
erzeugt. Benannte Pipes, sog. FIFOs, werden als Pseudodateien im Dateisystem
erzeugt mit
mkfifo <fifo>
Eine Pipe wird mit dem Befehl pipe
erzeugt. Die zurückgegebenen file handles werden wie Dateien benutzt.
Blockieren heisst offenbar, dass der Schreiberprozess schlafen gelegt wird, wenn die Pipe voll ist bzw. der Leserprozess schlafen gelegt wird, wenn die Pipe leer ist. Bitte kommentieren!
cat < dat-1.txt 2>&1 | sort > dat-2.txt
Die Datei dat-1.txt inklusive Fehlermeldungen sortiert in dat-2.txt geschrieben.
Die Datei wird für einen Prozess zugreifbar gemacht, so dass er mit
Befehlen wie read
oder write
darauf zugreifen kann.
Die Datei selbst wird dabei nicht verändert, möglicherweise aber
einige Dateiattribute, meistens atime
("access time").
Ja. Bei gleichzeitigem lesendem Zugriff gibt es keine Probleme, sobald ein Schreiber dabei ist, wird es schwierig.
Der Befehl tail -f <Datei>
zeigt
die letzten paar Zeilen einer Date an und zeigt ausserdem alle Zeilen an, die
der Datei (von einem anderen Prozess) angehängt werden. Sehr beliebt ist
tail
bei Logdateien, z.B. tail -f /var/log/messages
oder tail -f /etc/httpd/log/error_log
. Die sog. Follow-Funktion
von tail
ist wie folgt implementiert (stark gekürzt und
umsortiert; in voller länge bitte selber im tail-Quellcode nachschauen):
static void tail_forever (struct File_spec *f, int nfiles) { while (1) { struct stat stats; if (fstat (f[i].fd, &stats) < 0) { error (0, errno, "%s", pretty_name (&f[i])); break; } if (stats.st_size == f[i].size) { sleep (sleep_interval); } else { while (1) { long n = MIN (n_remaining, (off_t) BUFSIZ); bytes_read = safe_read (fd, buffer, n); if (bytes_read <= 0) break; xwrite (STDOUT_FILENO, buffer, bytes_read); n_remaining -= bytes_read; n_written += bytes_read; } f[i].size += n_written; } } }
Folgendes Beispiel demonstriert, dass Linux kein problem damit hat, denn zwei
Prozesse gleichzeitig in eine Datei schreiben. Das Ergebnis ist allerdings
etwas sonderbar.
Hier das Programm:
continuous_write.cc
Und das Shellskript zum Ausprobieren:
continuous_write.sh
Eine mögliche (von mit aber nicht ausprobierte) Lösung ist das
Öffnen der Datei mit dem Flag O_EXCL
.
seek
)fork
.
fork
:fork
im Kindprozess:fork
im Elternprozess:Ein I-Node ist ein Dateideskriptor im Dateisystem.
Ein X-Client ist ein Anwenungsprogramm, das unter X läuft.
Der X-Server ist für die Grafikausgabe und die Eingabe (Tastatur, Maus
usw.) zuständig
Server und Client kommunizieren über einen Socket, entweder direkt oder
über Netzwerk