Systemcalls
-
Hallo,
ich hoffe ich bin hier richtig.
Und zwar, ich studiere seit einem halben Jahr.
Wir haben in ein paar Tagen eine Klausur, wo wir einen C++ Prog lesen müssen und "verstehen" müssen. Dazu wird meist in der Klausur verlangt, dass man Systemcalls markiert und beschreibt. Das lustige ist, wir haben in der Vorlesung kaum ein C++ Prog erklärt bekommen und nur ansatzweise erklärt bekommen was Systemcalls sind.
Ich weiss aus den höreren Semester, dass die Klausur manchmal ziemlich fies sein soll, nach dem Motto Systemcalls im Code wo man nie zuvor in einer Vorlesung o.ä.gesehen hat.Gibt es evtl. eine Liste mit wichtigen Systemcalls? Evtl. mit kurzer Beschreibung was der Call macht?
Hier mal ein Beispiel aus der Probeklausur wen es interessiert:
/*01*/ int main(int argc, char *argv[]) /*02*/ { /*03*/ int status1, status2, pd[2]; /*04*/ if (pipe(pd) == -1) exit(1); /*05*/ switch (fork()) /*06*/ { /*07*/ case -1: /*08*/ exit(2); /*09*/ case 0: /*10*/ if (close(pd[0])==-1) exit(3); /*11*/ if (close(1)==-1 || dup(pd[1])!=1) exit(4); /*12*/ execlp (argv[1], &argv[1], NULL); exit(5); /*13*/ default: /*14*/ if (close(pd[1])==-1) exit(6); /*15*/ switch(fork()) /*16*/ { /*17*/ case -1: /*18*/ exit(7); /*19*/ case 0: /*20*/ if (close(0)==-1||dup(pd[0])!=0) exit(8); /*21*/ execvp (argv[2], &argv[2]); exit(9); /*22*/ default: /*23*/ wait (&status2); /*24*/ } /*25*/ wait(&status1); /*26*/ } /*27*/ exit(0); /*28*/ }Aufgaben dazu:
(1) Kennzeichnen Sie im folgenden Programm scws01 die Systemcalls und den Programmfluss für Vater- und Sohnprozesse.
(2) Beschreiben Sie die Funktion der Systemcalls und ihre Nutzung in diesem Programm. (Numerierung der Programmzeilen nutzen!)
(3) Welche Aufgabenstellung ist mit diesem Programm realisiert? Geben Sie ein Beispiel für die Nutzung dieses Programmes an
(4) Wie kann man die Funktion von scws01 mittels Shell-Kommandos realisieren?Der Vaterprozess geht von Zeile: 5-27 und der Sohn von Zeile 10-12 und evtl. ein weiterer Sohn Zeile 20-21 oder?
Danke im Voraus!!!
-
Das ist kein C++, sondern C, und auch kein reines Standard-C, sondern POSIX. In der Form gehört das eigentlich rüber ins Linux/Unix-Forum.
Der Artikel zum Thema in der englischen Wikipedia ist eine ganz gute Zusammenfassung dessen, was Syscalls sind.
Eine Liste von Syscalls (linux-spezifisch) findest du hier; diese ist bei einem modernen Betriebssystem aber natürlich ziemlich umfangreich.
Was das Beispielprogramm angeht: es nimmt zwei Parameter, fasst sie als Programmnamen auf, startet sie und leitet stdout des einen in stdin des anderen um. "prog foo bar" entspricht grob "foo | bar". Verwendete Syscalls (bzw. verwendete Bibliotheksfunktionen, die dann auf Syscalls umleiten) sind pipe, exit, fork, close, dup, execlp, execvp und wait.
Randnotiz: Die Bibliotheksfunktionen leiten nicht zwangsläufig auf die Syscalls um, deren Namen sie tragen. Beispielsweise benutzt fork() unter Linux sys_clone.
-
Danke, du hast mir schon mal sehr weitergeholfen.