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).