Initial Prozess soll 2 Prozesse aufrufen -> Kindprozesse crashen
-
Hallo,
wir sollen in Betriebssysteme ein Programm schreiben das ber einen Initial Prozess 2 Kindprozesse aufruft, die etwas in eine MappingFile schreiben.
Der Initialprozess soll das ganze dann wieder auslesen.
Das ganze funktioniert auch soweit, ausser das unsere Kindprozesse crashen und deswegen wohl nichts geschrieben wird

hier unser code:
Initialprozess:
# include <windows.h> # include <stdio.h> # include <iostream> using namespace std; void main () { HANDLE Mapfile; LPVOID mvof; char* ptr1; char* Anfangsadresse; Mapfile = CreateFileMapping (INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 5, "MappingObj"); if (Mapfile== NULL) cout<<"Mapfile konnte nicht erstellt werden!\n"; else { cout<<"Mapfile wurde erfolgreich erstellt.\n"; // Datei in virtuelle Adresse einblenden mvof = MapViewOfFile( Mapfile, FILE_MAP_ALL_ACCESS, 0, 0, 0); ptr1 = (char*)mvof; if (ptr1== NULL) cout<<"Fehler: Einblenden in virtuellen Adressraum fehlgeschlagen!\n"; else cout.setf (ios::hex); // Korrekte Darstellung // Ausgabe der virtuellen Adresse cout<<"Virtuelle Adresse: "<<mvof<<"\n\n"; Anfangsadresse = ptr1; // Sichern der Anfangsadresse } // Erzeugung Prozess 2 und 3 STARTUPINFO startupInfoA; PROCESS_INFORMATION processInfoA; STARTUPINFO startupInfoB; PROCESS_INFORMATION processInfoB; // Fenstertitel aendern GetStartupInfo(&startupInfoA); startupInfoA.lpTitle= "Prozess 2"; GetStartupInfo(&startupInfoB); startupInfoB.lpTitle= "Prozess 3"; // Prozess 2 und 3 erstellen if (CreateProcess(NULL, "D:\\Dokumente und Einstellungen\\Chegger\\Desktop\\H-Darmstadt\\BSProjekte\\Praktikum2 BS\\Debug\\Prozess2.exe", NULL, NULL, NULL, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfoA, &processInfoA) == FALSE) cout<< "Fehler Prozess 2 konnte nicht erstellt werden\n"; else cout<< "Prozess 2 konnte erstellt werden\n"; if (CreateProcess(NULL, "D:\\Dokumente und Einstellungen\\Chegger\\Desktop\\H-Darmstadt\\BSProjekte\\Praktikum2 BS\\Debug\\Prozess3.exe", NULL, NULL, NULL, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfoB, &processInfoB) == FALSE) cout<< "Fehler Prozess 3 konnte nicht erstellt werden\n"; else cout<< "Prozess 3 konnte erstellt werden\n"; //Auf Eingabe warten cout << "\n\nBitte Eingabe machen...\n"; getchar(); //Auslesen der von Prozess 2 und 3 geschriebenen Zeichen cout << "\nDas erste Zeichen ist: " << *ptr1 << "\n"; *ptr1++; cout << "\nDas zweite Zeichen ist: " << *ptr1 << "\n"; *ptr1++; cout << "\nDas dritte Zeichen ist: " << *ptr1 << "\n"; *ptr1++; cout << "\nDas vierte Zeichen ist: " << *ptr1 << "\n"; *ptr1++; cout << "\nDas fuenfte Zeichen ist: " << *ptr1 << "\n"; *ptr1++; cout << "\nDas sechste Zeichen ist: " << *ptr1 << "\n"; *ptr1++; //Einblendung wieder aufheben if(UnmapViewOfFile (Anfangsadresse ) == FALSE) cout << "Fehler: einblendung konnte nicht wieder geschlossen werden!\n"; else cout << "UnmapViewOfFile erfolgreich.\n"; // Handle schließen if ( CloseHandle (Mapfile) == FALSE) cout << "Fehler - Das Handle konnte nicht geschlossen werden!\n"; else { cout << "Handle erfolgreich geschlossen.\n"; //ExitProcess(0); } system("PAUSE"); }Prozess 2:
# include <windows.h> # include <stdio.h> # include <iostream> using namespace std; void main () { HANDLE ofmhandle; LPVOID mvof; char* ptr2; char* Anfangsadresse; int chr; do { //oeffnen eines benannten Dateiabbildungsobjektes ("MappingObj") //Return: Handle oder NULL ofmhandle = OpenFileMapping (FILE_MAP_ALL_ACCESS, FALSE, "MappingObj" ); if(ofmhandle == NULL) cout<<"OpenFileMapping fehlgeschlagen!\n"; else { cout << "OpenFileMapping erfolgreich.\n"; //Datei in virtuellen Adressraum einblenden mvof = MapViewOfFile ( ofmhandle, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (mvof = NULL) cout << "MapViewOfFile fehlgeschlagen!\n"; else { ptr2 = (char*) mvof; Anfangsadresse = ptr2; // Anfangadrese sichern // Ausgabe der Anfangsadresse cout << "\nAnfangsadresse: " << mvof << "\n"; cout.setf( ios::hex); //korrekte Darstellung // Speichern der Zeichen 1,3 und 9 *ptr2 = '1'; cout << "Speichern des ersten Zeichens: " << *ptr2 << "\n"; *ptr2++; *ptr2 = '3'; cout << "Speichern des zweiten Zeichens: " << *ptr2 << "\n"; *ptr2++; *ptr2 = '9'; cout << "Speichern des dritten Zeichens: " << *ptr2 << "\n"; *ptr2++; Sleep (600); } } }while (chr == 0 ); //Einblendung wieder aufheben if(UnmapViewOfFile (Anfangsadresse ) == FALSE) cout << "Fehler: einblendung konnte nicht wieder geschlossen werden!\n"; else cout << "UnmapViewOfFile erfolgreich.\n"; // Handle schließen if ( CloseHandle (ofmhandle) == FALSE) cout << "Fehler - Das Handle konnte nicht geschlossen werden!\n"; else { cout << "Handle erfolgreich geschlossen.\n"; } ExitProcess(0); }Prozess 3
# include <windows.h> # include <stdio.h> # include <iostream> using namespace std; void main () { HANDLE ofmhandle; LPVOID mvof; char* ptr3; char* Anfangsadresse; int chr; do { //oeffnen eines benannten Dateiabbildungsobjektes ("MappingObj") //Return: Handle oder NULL ofmhandle = OpenFileMapping (FILE_MAP_ALL_ACCESS, FALSE, "MappingObj" ); if(ofmhandle == NULL) cout<<"OpenFileMapping fehlgeschlagen!\n"; else { cout << "OpenFileMapping erfolgreich.\n"; if(mvof== NULL) cout<<"Fehler: MapViewOfFile fehlgeschlagen!\n"; else { ptr3 = (char*) mvof; Anfangsadresse = ptr3; // Anfangadrese sichern // Ausgabe der Anfangsadresse cout << "\nAnfangsadresse: " << mvof << "\n"; cout.setf( ios::hex); //korrekte Darstellung // Speichern der Zeichen 1,3 und 9 *ptr3 = *ptr3+3; *ptr3 = 'U'; cout << "Speichern des ersten Zeichens: " << *ptr3 << "\n"; *ptr3++; *ptr3 = 'V'; cout << "Speichern des zweiten Zeichens: " << *ptr3 << "\n"; *ptr3++; *ptr3 = 'W'; cout << "Speichern des dritten Zeichens: " << *ptr3 << "\n"; *ptr3++; Sleep (300); } } }while( chr == 0); //Einblendung wieder aufheben if(UnmapViewOfFile (Anfangsadresse ) == FALSE) cout << "Fehler: einblendung konnte nicht wieder geschlossen werden!\n"; else cout << "UnmapViewOfFile erfolgreich.\n"; // Handle schließen if ( CloseHandle (ofmhandle) == FALSE) cout << "Fehler - Das Handle konnte nicht geschlossen werden!\n"; else { cout << "Handle erfolgreich geschlossen.\n"; } ExitProcess(0); }P:S Wir haben die/das Projekt(e) auf Mutlibytecodierung umgestellt, an dem Pfad liegt es also nicht, die Prozesse werden ja auch erstellt.