Prozesse auslesen

Du hast dort eine Schleife. Und du rufst WaitForSingleObject immer wieder auf und wartest immer wieder 2 Sek. solange WAIT_TIMEOUT zurückkommt.
C:
do  {
    dwPriorityClass = 0;
    if(strcmp(pe32.szExeFile, "Apache.exe")==0){
      hProcess = OpenProcess( SYNCHRONIZE , FALSE, pe32.th32ProcessID );
      if( hProcess != NULL ){
	dwPriorityClass = GetPriorityClass( hProcess );
	PROCESS_INFORMATION piA;
	STARTUPINFO suiA;
	suiA.cb		=sizeof(STARTUPINFO);
	suiA.lpReserved	=0;
	suiA.lpDesktop	=NULL;
	suiA.lpTitle	=NULL;
	suiA.dwX		=0;
	suiA.dwY		=0;
	suiA.dwXSize	=0;
	suiA.dwYSize	=0;
	suiA.dwXCountChars	=0;
	suiA.dwYCountChars	=0;
	suiA.dwFillAttribute	=0;
	suiA.dwFlags	=STARTF_USESHOWWINDOW;
	suiA.wShowWindow	=SW_MINIMIZE;
	suiA.cbReserved2	=0;
	suiA.lpReserved2	=0;
	if(CreateProcess(NULL,strApacheShutdown,NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE|NORMAL_PRIORITY_CLASS,NULL,NULL,&suiA,&piA)==TRUE) {
	CloseHandle(piA.hThread);
      }
        WaitForInputIdle(piA.hProcess, INFINITE);
        while(WaitForSingleObject(piA.hProcess, 2000) == WAIT_TIMEOUT) {}
        WaitForInputIdle(hProcess, INFINITE);
        while(WaitForSingleObject(hProcess, 2000) == WAIT_TIMEOUT) {}
        CloseHandle( hProcess );
      }		
    }
  } while( Process32Next( hProcessSnap, &pe32 ) );
Er geht doch bei do alle Prozesse durch aber er geht nur in die Schleife rein, wenn der Prozessename Apache.exe ist. Dadurch wartet er für jeden Apache-Prozess die 2 Sekunden oder sehe ich das falsch?

Nochmal: Du startest den Apache als Service. Demnach wird er unter dem Konto ausgeführt welches in den Serviceeigenschaften hinterlegt ist. Normalerweise ist das NT-Autorität\SYSTEM (und das ist auch gut so).

Es ist völlig unerheblich wie du den Apache startest und unter welchem Konto deine start.exe läuft.
Also die start.exe startet den apache, der Apache läuft aber unter meinem Userkonto und nicht unter SYSTEM oder so. Also wenn ich in den Taskmanager reinschaue, dann läuft der Apache unter (sagen wir mal XYZ, wenn mein Username XYZ ist). Das hattest du falsch verstanden, meinte nicht die start.exe läuft unter dem usernamen sondern der Apache.

Was hat denn der strApacheShutdown mit dem TempPath zu tun?

Gruß
Also bisher hatte ich es ja so gemacht, dass ich mit GetTempPath() den Temp-Path des Users bekommen hatte/wollte, dort liegt eine log.txt in der der strApacheShutdown-Path und die Kopf-/Fußzeile (Wert vor dem starten der start.exe, damit man es wieder auf diesen Wert setzen kann) eingetragen ist. Verstehe halt nicht so ganz wieso das so ein Unterschied ist, klicke ich die shutdown.exe per Hand an, bekomme ich den richtigen Temp-Pfad und ich kann strApacheShutdown aus der log.txt auslesen. Starte ich shutdown.exe beim Beenden des Internet-Explorer-Fensters bekomme ich C:\Windows als TempVerzeichnis zurück, dadurch findet er die log.txt nicht! Und somit kann ich den Apache nicht herunterfahren, weil ich nicht weiß, wo die Apache.exe und wo die httpd.conf liegt und die Kopf-/Fußzeile kann auch nicht zurückgesetzt werden. Ich hoffe, du kannst jetzt verstehen wieso ich unbedingt den User-Temppath bräuchte. Hast du eine Idee, wie ich ansonsten zum User-Temppath kommen könnte oder starte ich vielleicht den Internet Explorer falsch?

Gruß
 
Er geht doch bei do alle Prozesse durch aber er geht nur in die Schleife rein, wenn der Prozessename Apache.exe ist.
Ja.
Dadurch wartet er für jeden Apache-Prozess die 2 Sekunden oder sehe ich das falsch?
Du hast dort eine SCHLEIFE. Du brichst diese Schleife niemals ab wenn der Apache Prozess nicht beendet wird.
Also die start.exe startet den apache, der Apache läuft aber unter meinem Userkonto und nicht unter SYSTEM oder so. Also wenn ich in den Taskmanager reinschaue, dann läuft der Apache unter (sagen wir mal XYZ, wenn mein Username XYZ ist). Das hattest du falsch verstanden, meinte nicht die start.exe läuft unter dem usernamen sondern der Apache.
Aha. Dann startet vermutlich der Apache das CGI Programm unter einem anderen Nutzerkonto oder einfach mit einer veränderten Umgebung in der weder TMP, noch TEMP, noch USERPROFILE gesetzt sind.

Unter welchem Konto wird die shutdown.exe ausgeführt, wenn du es als CGI Programm ausführst? Sind die angesprochenen Umgebungsvariablen gesetzt?
Also bisher hatte ich es ja so gemacht, dass ich mit GetTempPath() den Temp-Path des Users bekommen hatte/wollte, dort liegt eine log.txt in der der strApacheShutdown-Path und die Kopf-/Fußzeile (Wert vor dem starten der start.exe, damit man es wieder auf diesen Wert setzen kann) eingetragen ist. Verstehe halt nicht so ganz wieso das so ein Unterschied ist, klicke ich die shutdown.exe per Hand an, bekomme ich den richtigen Temp-Pfad und ich kann strApacheShutdown aus der log.txt auslesen. Starte ich shutdown.exe beim Beenden des Internet-Explorer-Fensters bekomme ich C:\Windows als TempVerzeichnis zurück, dadurch findet er die log.txt nicht! Und somit kann ich den Apache nicht herunterfahren, weil ich nicht weiß, wo die Apache.exe und wo die httpd.conf liegt
Also den Pfad zur Apache.exe kannst du aus den Prozessinformationen extrahieren.
und die Kopf-/Fußzeile kann auch nicht zurückgesetzt werden.
Welche Kopf/Fusszeilen? Verwendest du SSI?
Ich hoffe, du kannst jetzt verstehen wieso ich unbedingt den User-Temppath bräuchte. Hast du eine Idee, wie ich ansonsten zum User-Temppath kommen könnte oder starte ich vielleicht den Internet Explorer falsch?
Du hast nicht genug Informationen geliefert wie genau du den Apache nun startest, wie die Konfiguration zustande kommt usw. Evlt. kannst du den Pfad aus den standardmäßig gesetzten Umgebungsvariablen extrahieren. Siehe z.B. http://www.cgi101.com/book/ch3/text.html

Gruß
 
Ja.

Du hast dort eine SCHLEIFE. Du brichst diese Schleife niemals ab wenn der Apache Prozess nicht beendet wird.
Ich dachte, dass er nur 2 Sekunden lang probiert herunterzufahren, ansonsten Wait-Timeout zurückgibt und abbricht. Ist anscheinend nicht so? Wie meinst du wäre es dann besser?

Aha. Dann startet vermutlich der Apache das CGI Programm unter einem anderen Nutzerkonto oder einfach mit einer veränderten Umgebung in der weder TMP, noch TEMP, noch USERPROFILE gesetzt sind.

Unter welchem Konto wird die shutdown.exe ausgeführt, wenn du es als CGI Programm ausführst? Sind die angesprochenen Umgebungsvariablen gesetzt?
die shutdown.exe wird auch als XYZ (ausgedachter username) im Taskmanager aufgeführt, wenn ich es als CGI-Programm ausführe, also unter meinem usernamen läuft die shutdown.exe sozusagen.
Unter System-> Erweitert->Umgebungsvariablen, steht unter den Umgebungsvariablen von user XYZ
TMP und TEMP als C:\Documents and Settings\... drinnen, aber unter Systemvariablen steht bei TMP und TEMP C:\Windows\TEmp, wobei er ja bei mir C:\Windows zurückgibt. Könnte es sein, dass ich beim Server etwas angeben könnte, also in den Einstellungen vom Apache?

Also den Pfad zur Apache.exe kannst du aus den Prozessinformationen extrahieren.
Ja, wie geht das? Wobei ich ja wissen müsste, wo die httpd.conf liegt, denn die liegt im User-Tempverzeichnis. Kann man das auch über die Prozessinformationen herausfinden?

Welche Kopf/Fusszeilen? Verwendest du SSI?
Wir lesen die Fuß-/Kopfzeilen aus der Registry aus, schreiben sie in die log.txt und wollen sie am Ende wieder zurücksetzen, da sie nur in dieser Projektumgebung beim Drucken angezeigt werden sollen. Ist Wunsch vom Kunden.

Du hast nicht genug Informationen geliefert wie genau du den Apache nun startest, wie die Konfiguration zustande kommt usw. Evlt. kannst du den Pfad aus den standardmäßig gesetzten Umgebungsvariablen extrahieren. Siehe z.B. http://www.cgi101.com/book/ch3/text.html

Gruß
Wir starten den Apache folgendermaßen:
C:
PROCESS_INFORMATION piA;
		STARTUPINFO suiA;
		suiA.cb		=sizeof(STARTUPINFO);
		suiA.lpReserved	=0;
		suiA.lpDesktop	=NULL;
		suiA.lpTitle	=NULL;
		suiA.dwX		=0;
		suiA.dwY		=0;
		suiA.dwXSize	=0;
		suiA.dwYSize	=0;
		suiA.dwXCountChars	=0;
		suiA.dwYCountChars	=0;
		suiA.dwFillAttribute	=0;
		suiA.dwFlags	=STARTF_USESHOWWINDOW;
		suiA.wShowWindow	=SW_MINIMIZE;
		suiA.cbReserved2	=0;
		suiA.lpReserved2	=0;
		if(CreateProcess(NULL,strApache,NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE|NORMAL_PRIORITY_CLASS,NULL,NULL,&suiA,&piA)==TRUE) {}
, wobei "PFad_zum_apche\Apache.exe -f Pfad_zur_httpd.conf\httpd.conf -k start" in strApache steht.

Gruß
 
Ich dachte, dass er nur 2 Sekunden lang probiert herunterzufahren, ansonsten Wait-Timeout zurückgibt und abbricht. Ist anscheinend nicht so? Wie meinst du wäre es dann besser?
Da solltest du wirklich alleine drauf kommen.
die shutdown.exe wird auch als XYZ (ausgedachter username) im Taskmanager aufgeführt, wenn ich es als CGI-Programm ausführe, also unter meinem usernamen läuft die shutdown.exe sozusagen.
Unter System-> Erweitert->Umgebungsvariablen, steht unter den Umgebungsvariablen von user XYZ
TMP und TEMP als C:\Documents and Settings\... drinnen, aber unter Systemvariablen steht bei TMP und TEMP C:\Windows\TEmp, wobei er ja bei mir C:\Windows zurückgibt.
Es ist ziemlich irrelevant was in diesen Variablen drin steht. Du solltest überprüfen welche Variablen in dem CGI Prozess gesetzt sind.
Könnte es sein, dass ich beim Server etwas angeben könnte, also in den Einstellungen vom Apache?
Ja. Stichwort mod_env.
Ja, wie geht das?
Ich hatte dich bereits auf die entsprechende Information verwiesen.
Wobei ich ja wissen müsste, wo die httpd.conf liegt, denn die liegt im User-Tempverzeichnis. Kann man das auch über die Prozessinformationen herausfinden?
Ja, indem man die Umgebungsvariablen des Prozesses ausliest.
Wir lesen die Fuß-/Kopfzeilen aus der Registry aus, schreiben sie in die log.txt und wollen sie am Ende wieder zurücksetzen, da sie nur in dieser Projektumgebung beim Drucken angezeigt werden sollen. Ist Wunsch vom Kunden.
Ich verstehe immer noch nicht von welchen Kopf-/Fußzeilen du redest.
Wir starten den Apache folgendermaßen:
Ja, geschenkt. Du solltest erläutern wie ihr den Apache genau verwenden wollt. Wie die Konfiguration zustande kommt. Wie kommt es z.B. das der Apache eine log.txt in das temp. Verzeichnis schreibt? Wieso liegt die httpd.conf im temp. Verzeichnis? Wird die Datei generiert?

Gruß
 
Da solltest du wirklich alleine drauf kommen.
Ich würde wahrscheinlich nicht fragen, wenn ich wüsste, wie:(

Es ist ziemlich irrelevant was in diesen Variablen drin steht. Du solltest überprüfen welche Variablen in dem CGI Prozess gesetzt sind.
Ja. Stichwort mod_env.
Ich bin an dieser Stelle etwas überfordert, da ich mich noch nicht so tiefgehend mit der Apache-Installation bzw Einstellungsmöglichkeiten beschäftigt habe, da das bisher mein Chef gemacht hat. Ich habe jetzt ein bisschen danach gegoogelt, anscheinend kann man die Definition von Umgebungsvariablen in die httpd.conf aufnehmen. Habe dort jetzt ein Setenv TMP "pfad zum user-Temp" aufgenommen und jetzt findet er meine log-datei zum Auslesen *freu*

Ich verstehe immer noch nicht von welchen Kopf-/Fußzeilen du redest.
Ich rede von den Kopf-/Fußzeilen im Internet Explorer, da der Kunde möchte, dass beim Ausdrucken etwas bestimmtes als Kopf-/Fußzeile angezeigt wird. Dies muss aber nach dem Schließen des Projektes geändert werden, da das projektspezifische Infos sind.

Ja, geschenkt. Du solltest erläutern wie ihr den Apache genau verwenden wollt. Wie die Konfiguration zustande kommt. Wie kommt es z.B. das der Apache eine log.txt in das temp. Verzeichnis schreibt? Wieso liegt die httpd.conf im temp. Verzeichnis? Wird die Datei generiert?
Das mit der log.txt hat mein Chef damals so programmiert, um vielleicht über spezielle Aufrufe zu haben. Ich dachte die könnte man für diesen Fall auch verwenden, da die ja beim Starten des Programmes geschrieben wird und da ja die Kopf-/fußzeilen ausgelesen werden und man auch weiß wie der Apache gestartet wird und kann dann also darin festhalten wie der Apapche heruntergefahren werden müsste. die httpd.conf liegt im temp Verzeichnis weil wir das so in der start.exe programmiert haben, dort liegen auch httpd.pid, jserv.conf, jserv.properties,... da unser Programm von CD gestartet wird und man im User-Temp-Verzeichnis immer Schreibrecht haben sollte und diese Dateien dann bei Programmstart geschrieben werden. Genau die Datei wird beim Starten generiert.

Das Herunterfahren würde jetzt funktionieren, dauert aber noch viel zu lange, mit dem system-Aufruf ca. 40Sekunden, mit dem GetProcessList() und CreateProcess() dauert es 1 Minute. Wäre blöd, wenn jmd kurz drauf merkt er will neustarten und er ist noch nicht heruntergefahren, hoffe ich bekomme das noch schneller hin. Vielleicht liegt es auch wirklich daran dass sie sich gegenseitig blockieren, habe aber noch nicht verstanden wie ich das umgehen kann. Hoffe bekomme das noch hin

Viele Grüße und vielen Dank
 
Ich würde wahrscheinlich nicht fragen, wenn ich wüsste, wie:(
Ich habe im Grunde schon x-mal mit dem Zaunpfahl gewunken, die nächste Stufe wäre zu schlagen... Das willst du doch nicht, oder?! ;-]

Aber ich stelle nochmal die Frage: WOZU DIE SCHLEIFE?
Ich rede von den Kopf-/Fußzeilen im Internet Explorer, da der Kunde möchte, dass beim Ausdrucken etwas bestimmtes als Kopf-/Fußzeile angezeigt wird.
Ach, Du meinst beim Ausdrucken?
Dies muss aber nach dem Schließen des Projektes geändert werden, da das projektspezifische Infos sind.

Das mit der log.txt hat mein Chef damals so programmiert, um vielleicht über spezielle Aufrufe zu haben. Ich dachte die könnte man für diesen Fall auch verwenden, da die ja beim Starten des Programmes geschrieben wird und da ja die Kopf-/fußzeilen ausgelesen werden und man auch weiß wie der Apache gestartet wird und kann dann also darin festhalten wie der Apapche heruntergefahren werden müsste. die httpd.conf liegt im temp Verzeichnis weil wir das so in der start.exe programmiert haben, dort liegen auch httpd.pid, jserv.conf, jserv.properties,... da unser Programm von CD gestartet wird und man im User-Temp-Verzeichnis immer Schreibrecht haben sollte und diese Dateien dann bei Programmstart geschrieben werden. Genau die Datei wird beim Starten generiert.
Du willst also diese log.txt auslesen um festzustellen, wie die Konfiguration der Kopf-/Fußzeile war um diese dann zurücksetzen zu können?
Das Herunterfahren würde jetzt funktionieren, dauert aber noch viel zu lange, mit dem system-Aufruf ca. 40Sekunden, mit dem GetProcessList() und CreateProcess() dauert es 1 Minute. Wäre blöd, wenn jmd kurz drauf merkt er will neustarten und er ist noch nicht heruntergefahren, hoffe ich bekomme das noch schneller hin. Vielleicht liegt es auch wirklich daran dass sie sich gegenseitig blockieren, habe aber noch nicht verstanden wie ich das umgehen kann.
Wie bereits gesagt mußt du lediglich einen Kindprozess starten und das CGI Programm beenden um das CGI Programm und den Apache zu entkoppeln.

Du hast übrigens vergessen das piA Prozess-Handle zu schließen.

Gruß
 
Ich habe im Grunde schon x-mal mit dem Zaunpfahl gewunken, die nächste Stufe wäre zu schlagen... Das willst du doch nicht, oder?! ;-]
Aber ich stelle nochmal die Frage: WOZU DIE SCHLEIFE?
Nein natürlich nicht ;-) Also ich denke mal das while ist hier einfach falsch und es reicht, WaitForSingleObject(hProcess, 2000); oder?

Ach, Du meinst beim Ausdrucken?
Du willst also diese log.txt auslesen um festzustellen, wie die Konfiguration der Kopf-/Fußzeile war um diese dann zurücksetzen zu können?
Genau :) das klappt jetzt immerhin, nachdem du mir den Tipp mit mod_env gegeben hattest. Danke :)

Wie bereits gesagt mußt du lediglich einen Kindprozess starten und das CGI Programm beenden um das CGI Programm und den Apache zu entkoppeln.
wie das mit dem Entkoppeln klappen könnte, verstehe ich noch nicht so ganz. Du hast mir ja schon mal als Tipp diesen Code geschrieben:
C:
int main(int argc, char argv[]) {
  // wenn als CGI Programm ausgeführt
  if (getenv("REMOTE_HOST") != NULL) {
    char env[] = "\0\0";
    puts("Content-type: text/plain\n\n"
           "shutting down...");
    fclose(stdout);
    // dieses Programm als Kindprozess starten, mit
    ...
    CreateProcess(argv[0], NULL, ...,
        FALSE, // inherit HANDLES
        ...
        env,  // Environment
        ...);
  } else {
     // wie bisher.
  }
}

was wäre argv[0] in diesem Fall? Was wären die letzten 2 Parameter bei createprocess? Und würde ich dann nach CreateProcess den Apache herunterfahren lassen? Ich habe bisher mein c++ programm als Project mit der Eigenschaft MFC-Anwendungs-Assistent (exe) erstellt, weil ich ja unbedingt eine exe haben möchte und dadurch habe ich gar keine int main bzw. habe bisher den Code in die Funktion InitInstance() geschrieben. Ist das falsch gewesen?

Du hast übrigens vergessen das piA Prozess-Handle zu schließen.
Stimmt - danke :)

Gruß und nochmal danke für alle Tipps bisher
 
Zuletzt bearbeitet:
Nein natürlich nicht ;-) Also ich denke mal das while ist hier einfach falsch und es reicht, WaitForSingleObject(hProcess, 2000); oder?
Ja :-)
Genau :) das klappt jetzt immerhin, nachdem du mir den Tipp mit mod_env gegeben hattest. Danke :)
Wenn du allerdings in der httpd.conf generieren kannst was du willst, dann könntest du natürlich auch gleich eine Variable genieren, in der die alten Einstellungen drin stehen. Weiterhin wäre zu überlegen, ob du nicht einfach eine temp. Datei (siehe http://msdn.microsoft.com/en-us/library/aa363875(v=vs.85).aspx) erzeugst. Dann brauchst du dich eigentlich gar nicht um das Löschen kümmern.
wie das mit dem Entkoppeln klappen könnte, verstehe ich noch nicht so ganz. Du hast mir ja schon mal als Tipp diesen Code geschrieben:
...
was wäre argv[0] in diesem Fall?
argv[0] ist wie üblich in main belegt:
C:
int main(int argc, char argv[])
Also der Pfad zur gerade ausgeführten .exe Datei.
Und würde ich dann nach CreateProcess den Apache herunterfahren lassen?
Nein.

Apache -> deineCGI.exe -> deineCGI.exe

Den Apache fährst du in der zweiten Instanz herunter, nicht in der ersten.
Ich habe bisher mein c++ programm als Project mit der Eigenschaft MFC-Anwendungs-Assistent (exe) erstellt, weil ich ja unbedingt eine exe haben möchte und dadurch habe ich gar keine int main bzw. habe bisher den Code in die Funktion InitInstance() geschrieben. Ist das falsch gewesen?
Hm. Vielleicht nicht gerade sinnvoll wenn du gar kein MFC benutzt. Du kannst aber über die GetModuleFileName Funktion (http://msdn.microsoft.com/en-us/library/ms683197(v=vs.85).aspx) auch den aktuellen Pfad zur exe herausfinden.

Gruß
 
Wenn du allerdings in der httpd.conf generieren kannst was du willst, dann könntest du natürlich auch gleich eine Variable genieren, in der die alten Einstellungen drin stehen. Weiterhin wäre zu überlegen, ob du nicht einfach eine temp. Datei (siehe http://msdn.microsoft.com/en-us/library/aa363875(v=vs.85).aspx) erzeugst. Dann brauchst du dich eigentlich gar nicht um das Löschen kümmern.
Das muss ich mir mal anschauen. hört sich gut an

argv[0] ist wie üblich in main belegt:
C:
int main(int argc, char argv[])
Also der Pfad zur gerade ausgeführten .exe Datei.

Nein.

Apache -> deineCGI.exe -> deineCGI.exe

Den Apache fährst du in der zweiten Instanz herunter, nicht in der ersten.

Hm. Vielleicht nicht gerade sinnvoll wenn du gar kein MFC benutzt. Du kannst aber über die GetModuleFileName Funktion (http://msdn.microsoft.com/en-us/library/ms683197(v=vs.85).aspx) auch den aktuellen Pfad zur exe herausfinden.

Gruß
Ich versuche das jetzt umzustellen, habe mal einen neuen ARbeitsbereich erstellt und versuche das jetzt noch aufzunehmen, was du mir gerade hast, aber ich verstehe es noch nicht so ganz.

Ich habe das jetzt folgendermaßen aufgenommen:
C:
int main(int argc, char* argv[])
{
	if (getenv("SERVER_NAME") != NULL) {
		char env[] = "\0\0";
		PROCESS_INFORMATION piA;
		STARTUPINFO suiA;
		CreateProcess(argv[0],NULL,NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE|NORMAL_PRIORITY_CLASS,env,NULL,&suiA,&piA);
  } else {
//hereinkopiert so wie es vorher war
}
Weil du meintest den Apache fährst du in der zweiten Instanz herunter. Meinst du den else-Zweig? Wie kommt er da rein, er geht doch sicher in die main nur einmal rein und dann würde er in den if-Zweig gehen oder? Bisher geht er jetzt zwar in den if-Zweig und beendet die test.exe. Aber der Apache wird dann natürlich nicht heruntergefahren

Tut mir echt leid, dass ich soviel frage, aber verstehe es einfach noch nicht und wäre so super wenn ich das verstehen würde und das Programm dann richtig funktioniere würde *träum*

Gruß
 
Zuletzt bearbeitet:
Ich versuche das jetzt umzustellen, habe mal einen neuen ARbeitsbereich erstellt und versuche das jetzt noch aufzunehmen, was du mir gerade hast, aber ich verstehe es noch nicht so ganz.

Ich habe das jetzt folgendermaßen aufgenommen:
C:
int main(int argc, char* argv[])
{
	if (getenv("SERVER_NAME") != NULL) {
		char env[] = "\0\0";
		PROCESS_INFORMATION piA;
		STARTUPINFO suiA;
		CreateProcess(argv[0],NULL,NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE|NORMAL_PRIORITY_CLASS,env,NULL,&suiA,&piA);
  } else {
//hereinkopiert so wie es vorher war
}
Das ist nicht der aktuelle Code. Die COMSPEC Variable muss gesetzt sein. Siehe Beitrag #48.
Weil du meintest den Apache fährst du in der zweiten Instanz herunter. Meinst du den else-Zweig?
Ja.
Wie kommt er da rein, er geht doch sicher in die main nur einmal rein und dann würde er in den if-Zweig gehen oder? Bisher geht er jetzt zwar in den if-Zweig und beendet die test.exe. Aber der Apache wird dann natürlich nicht heruntergefahren
Wenn ein Programm als CGI Programm ausgeführt wird, sind bestimmte Umgebungsvariablen gesetzt (z.B. REMOTE_ADDR). So kann man feststellen, ob das aktuelle Programm als CGI Programm ausgeführt wird.

Wenn man dann einen Kindprozeß erzeugen will der nicht als CGI Programm ausgeführt werden soll, muss man dann natürlich sicherstellen, dass in diesem Prozess die CGI Variablen nicht gesetzt sind. Dazu werden neue Umgebungsvariablen an den Kindprozess übergeben.

Gruß
 
Zurück