Systemcall signal() besser formuliert
-
Hallo,Hallo,
ich habe dieser Programm Code bekommen, da ich leider keine C++ profi Programmer mir fehlt es schwer zu verstehen was hier passiert..So viel ich weiß es geht um drei Prozesse, die erste Case-1:liefert eine Fehler Meldung wenn die zweite Prozess nicht erzeugt wird,dann wird ein Signal händler installiert wo nach 8 sec ein Alarm zu Sohn Prozess sendet das wird dann ausgeführt nach Signal 14 von Systemcall aufgelöst ist.
Das ist alles was ich Verstanden habe ob ich überhaupt richtig verstanden habe. Ich werde mich freuen wenn einer kommentieren würde was wirklich gescheit. Ich wäre sehr dankbar, wenn ihr erklären konnte.
Beispiel weise wenn ich kompiliere und und ./ueb3 find / xxx als Parameter eingebe dann sucht er nach die Datei xxx und nach 8 sec hält er und wenn ich eine beliebige taste drücke sucht er weiter wenn nicht dann endet sich das Programm von sich selbst
Ich bedanke mich im voraus#include <stdio.h> #include <signal.h> #include <unistd.h> #include <wait.h> #include <errno.h> #include <iostream.h> using namespace std; int pidsib1; int main (int argc, char *argv[]) { int status, existat, pidsib2; char ant; char antwort, errtext; void alhnd(int signr), alhnd1(int signr); switch (pidsib1=fork()) { case -1: perror(argv[0]); cout << "Fehler bei fork"<< argv[0] << endl; existat = 1; break; case 0: /* nur Sohn */ execvp(argv[1],&argv[1]); /* nur Sohn */ perror(argv[0]); cout <<"Fehler beim Laden\n "<< argv[0]<< endl; /* nur Sohn */ existat = 2; break; /* nur Sohn */ default: /* case >0 */ switch (pidsib2=fork()) { case -1: perror("2.fork:"); existat = 11; break; case 0: /* nur Sohn */ while (2>1) { signal(SIGALRM,alhnd); // installiert perror("signal1:"); if (alarm(8) == -1) {perror("alarm");} if (pause() == -1) {perror("pause");} if (kill(pidsib1, SIGSTOP) == -1) {perror("kill-SIGSTOP:"); exit(0);} cout << "Weiter mit beliebiger Taste\n"<< endl; signal(SIGALRM, alhnd1); if (alarm(5) == -1) {perror("alarm");} ant=getchar(); if (alarm(0) == -1) {perror("alarm");}; if (kill(pidsib1, SIGCONT) == -1) {perror("kill-SIGCONT:");} } } if(wait(&status) < 0 || status != 0) {perror(":Problem beim Ausfuehren "); cout << "status " << status << endl; existat = 3; } else { cout << " Ausfuehrung o.k. !" << argv[1] << endl; existat=0; } } exit(existat); } void alhnd(int signr){ char ant; void alhnd1(int signr); cout << "Wartet auf signal:" << signr <<endl; return; } void alhnd1(int signr) { cout << "Dies war kill aus alhnd1"<< endl; kill(0,SIGKILL); return; }
[/cpp]