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.


Anmelden zum Antworten