Jessica_n Geschrieben 5. Dezember 2006 Geschrieben 5. Dezember 2006 Hi ihr, ich bin im Moment voll im Stress und muss jetzt noch so ne Informatikaufgabe lösen. Leider hab ich aber überhaupt keinen Plan wie das funktioniert... ): Könnt ihr mir zu folgenden Aufgaben ein paar Tips geben??? Wär echt voll nett! :confused: tschüß! Jessica a) #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <iostream> using std::cout; using std::endl; int main() { // !!! OHNE Fehlerbehandlung !!! int kanal[2]; socketpair(AF_LOCAL, SOCK_STREAM, 0, kanal); write(kanal[1], "HelloWorld",11); write(kanal[0], "dlroWolleH",11); char buffer[11]; read(kanal[0], buffer, 11); cout << “Lese Kanal 0: “ << buffer << endl; read(kanal[1], buffer, 11); cout << “Lese Kanal 1: “ << buffer << endl; close(kanal[0]); close(kanal[1]); } Was tut dieses Programm (Notfalls auf einem Linuxsystem mit g++ Ue.BS.Blatt6-A2a.cpp -o Ue.BS.Blatt6-A2a.exe übersetzen und ausprobieren)? Erklären Sie die Funktionsweise von socketpair! Ziehen Sie auch die manpage (man 2 socketpair) zu Rate! Wie kann mit den Befehlen socketpair und fork ein Kommunikationskanal zwischen einem Vaterprozess und seinem Kindprozess aufgebaut werden? Erweitern Sie dazu das Beispielprogramm in dem ein Kind seinem Vater "HelloDad" durch ein socketpair mitteilt und der Vater die empfangene Nachricht ausgibt. Erklären Sie die genaue Funktionsweise, wie der Kommunikationskanal zustande kommt! #include <iostream> #include <sys/wait.h> #include <sys/types.h> #include <unistd.h> #include <signal.h> using namespace std; const int base=10; const int digits=20; int zaehler[digits]; void print(int signum) { char zaehlerstand[digits+1]; for (int i=0; i<digits; i++) zaehlerstand = (char)(zaehler[digits-i-1]+(int)'0'); zaehlerstand[digits]=0; cout << "Zählerstand = " << zaehlerstand << endl; }v oid zaehle() { for (int i=0; i<digits; i++) zaehler=0; int i=0; while (zaehler[digits-1]==0) { while (zaehler==base-1) { sleep(1); zaehler=0; i++; }z aehler++; i=0; } }i nt main() { pid_t pid; pid=fork(); if (pid<0) cout << "Fehler bei Prozesserzeugung" << endl ; else if(pid==0) { // Kindprozess zaehle(); } else { // Vaterprozess char eingabe=2; while (eingabe!='0') { cout << "ENTER = Zählerstand, 0 + ENTER = ENDE" << endl ; eingabe=cin.get(); print(1); }k ill(pid, SIGTERM); waitpid(pid,0,0); } } Das Programm soll wie folgt arbeiten: Der Kindprozess inkrementiert den Zähler und der Vater gibt diesen auf Anfrage aus. Da der Kindprozess mit fork() erzeugt wird, funktioniert die angegebene Lösung so nicht (siehe auch Übung 2, Aufgabe 2b). Ändern Sie das Programm so ab, daß das Kind bei Eintreffen eines speziellen Signals SIGUSR1 den Zählerstand ausgibt. Gehen sie dabei wie folgt vor: Mit dem kill()-Befehl können Sie Signale an einen anderen Prozess senden. Verwenden Sie hierzu das Signal SIGUSR1, welches vom Vater an den Sohn gesendet werden soll. Mit dem Befehl signal() kann für den Sohn ein entsprechender Signalhandler festgelegt werden, der dann die Ausgabe-Funktion print() des Programmes aufrufen soll. Achtung: Nur der Sohn darf auf dieses Signal reagieren! Betrachten Sie hierzu auch die entsprechenden manpages (man 2 kill und man 2 signal bzw. man 7 signal). Dort ist auch die korrekte Aufrufsyntax der Befehle angegeben. Starten Sie das geänderte Programm. Drücken Sie ENTER im Abstand von mehreren Sekunden. Vergleichen Sie den Zählerfortschritt mit dem wenn Sie ENTER gedrückt halten. Beschreiben Sie was im System passiert und erklären Sie damit Ihre Beobachtung! Beachten Sie den Aufruf von sleep (man 3 sleep).
Klotzkopp Geschrieben 5. Dezember 2006 Geschrieben 5. Dezember 2006 ich bin im Moment voll im Stress und muss jetzt noch so ne Informatikaufgabe lösen. Leider hab ich aber überhaupt keinen Plan wie das funktioniert... ):Und warum gibt dir jemand so eine Aufgabe, wenn du keinen Plan hast? Oder solltest du eigentlich Plan haben? Könnt ihr mir zu folgenden Aufgaben ein paar Tips geben???Nein. Dieses Forum ist kein Aufgabenlöseservice. Einfach unkommentiert die Problemstellung abzuladen, ist ziemlich unhöflich. Auch der Threadtitel hätte besser gewählt werden können. Sag, wo die konkreten Probleme liegen, dann wird dir auch geholfen.
Jessica_n Geschrieben 5. Dezember 2006 Autor Geschrieben 5. Dezember 2006 Hi du, ich weiß dass ein Socket eine Verbindungsstelle zwischen zwei Programmen ist, mehr sagt mir die manpage bei Linux auch nicht. und das Programm schreibt HelloWorld und das nochmal rückwärts. ( ; fork bildet eine identische Kopie des Vaterprozesses.Bloß wie ein Kommunikationskanal zwischen Vaterprozess und Kindsprozess aufgebaut wird weiß ich eben nicht... Vielleicht kann mir das ja jemand kurz erklären....Braucht ja nicht so umfangreich sein. danke, Jessica
Bubble Geschrieben 5. Dezember 2006 Geschrieben 5. Dezember 2006 Die Aufgabenstellugn enthält bereits eine Anleitung, wie Du vorgehen sollst. Die vom Aufgabensteller gewünschte Lösung ist Linux(Unix)-spezifisch. Eine Kommunikation zwischen zwei unabhängigen Prozessen kann man auf unterschiedliche Arten realisieren, die gewünschte Art ist nur eine Möglichkeit. Du solltest das Programm zuerst einmal kompilieren, ausprobieren und danach die erforderlichen Änderungen nvornehmen. Wenn dann dazu Fragen auftauchen, kannst Du sie gerne stellen.
Jessica_n Geschrieben 5. Dezember 2006 Autor Geschrieben 5. Dezember 2006 Hi, also, wie du schon lesen konntest hab ich schon kompiliert und ausprobiert. Ich weiß auch das beide Kanäle miteinander kommunizieren. Das was im array 0 eingelesen wird, wir im kanal 1 ausgeben. und umgekehrt. Das mit dem Kommunikationskanal hab ich (wie ich schon erwähn habe) allerdings nicht verstanden.... Ich will nicht zickig wirken, aber es wäre schön, wenn ihr mal das *besserwissergetue" weglasst.... oder wisst ihr etwa schon alles?! Jessica
Guybrush Threepwood Geschrieben 5. Dezember 2006 Geschrieben 5. Dezember 2006 Ich will nicht zickig wirken, aber es wäre schön, wenn ihr mal das *besserwissergetue" weglasst.... oder wisst ihr etwa schon alles?! Das hat nichts mit "besserwissergetue" zu tun sondern damit das von dir Null Eigeninitiative kommt. Du postest die Aufgabenstellung und erwartest eine Fertige Ausführung die du am Besten nur ausdrucken und abgeben brauchst. Wir helfen dir hier sehr gerne wenn du konkrete Probleme hast, aber wie Klotzkopp bereits gesagt hat sind wir hier kein Hausaufgabenservice. Soweit wie ich das rauslesen konnte musst du im 2. Programm einen Signalhandler im Childprozess erstellen welcher den Zählerstand ausgibt und der vom Vater über ein entsprechendes Signal starten kann. Entsprechende Hilfestellungen sind in der Aufgabenstellung gegeben. Wenn du damit Probleme hast dann poste deinen Versuch und womit genau du Probleme hast.
Jessica_n Geschrieben 5. Dezember 2006 Autor Geschrieben 5. Dezember 2006 Also jetzt pass mal auf "Mr.-Ich-hab-tausend-Jahre-Informatik-studiert". Deine kommentare kannst du bleiben lassen! Ich hock seit 2 Tagen an dem blöden Zeug. Aber ich komm halt nicht weiter. Ich hab ja nicht mal gewusst, was die 11 bei dem blöden write-befehl heißt! Ich kann das halt nicht. Und mal eben so schnell c++ lernen is ein bisschen schwierig. Ich muss mir hier nicht sagen lassen ich würde keine eigeninitiative zeigen!! So was vermessenes! Ich müsste den ****** überhaupt nicht machen! Dann ist man halt irgendwann in zwei Monaten am *****... Entweder es will mir jetzt einer helfen, oder ihr schreibt weiterhin eure ach so sinnvollen und hilfreichen Kommentare Und nochmal für alle zum mitschreiben: LESEN KANN ICH! Vllt. findet ja doch noch jemand einen passenden, hilfreiche Hinweis, Danke, Jessica
Klotzkopp Geschrieben 5. Dezember 2006 Geschrieben 5. Dezember 2006 Also jetzt pass mal auf "Mr.-Ich-hab-tausend-Jahre-Informatik-studiert".In dem Ton schon mal bitte gar nicht. Ich hock seit 2 Tagen an dem blöden Zeug. Aber ich komm halt nicht weiter. Ich hab ja nicht mal gewusst, was die 11 bei dem blöden write-befehl heißt!Dann fehlen dir offenbar die Grundlagen, um diese Aufgabe selbst zu lösen. Ich kann das halt nicht. Und mal eben so schnell c++ lernen is ein bisschen schwierig.Genau das solltest du dann dem sagen, der dir diese Aufgabe gestellt hast. Und nicht versuchen, mit der Leistung Anderer Wissen vorzutäuschen, das du nicht hast und dir auch nicht aneignen willst. Vllt. findet ja doch noch jemand einen passenden, hilfreiche Hinweis,Du hast von Guybrush Threepwood und Bubble schon einige Hinweise bekommen. Dieser Thread ist zu. Du kannst gerne einen neuen Versuch starten, diesmal vielleicht mit einer konkreten Problembeschreibung und etwas angemessenerem Verhalten.
Empfohlene Beiträge