Signal Handler in Windows

26/05/2008 - 14:41 von Thomas Steinbach | Report spam
Hallo NG,

ich erstelle einen neune Process und starte damit ein
anderes Program als Anwendung (quasi in Console).
Genauer httpd.exe (Apache 2.2.8)

// global vars
STARTUPINFO sih;
PROCESS_INFORMATION pih;

mit
...
CreateProcess(NULL, "httpd.exe", NULL, NULL, FALSE,
CREATE_NEW_PROCESS_GROUP, NULL, NULL, &sih, &pih)
...

spaeter moechte ich dem Apache einen SignalHandler schicken.
btw Wenn ich Control+C an der Console druecke, dann uterbricht
das den Apache... Wenn ich das aber in eine Funktion packe, dann
geht das scheinbar nicht.

void StopApacheBySig(void) {
HANDLE hProc;
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pih.dwProcessId);
//GenerateConsoleCtrlEvent(CTRL_C_EVENT, pih.hProcess) ;
GenerateConsoleCtrlEvent(CTRL_C_EVENT, hProc);
}

egal ob ich nun hProc ueber OpenProcess angebe oder ein
Handle ueber die strucktur pih.hProcess. Als extended Error
bekomme ich "invalid handle"

Mit CREATE_NEW_PROCESS_GROUP bekomme ich
ja einen neue Processgruppe... und nach dem Signal CTRL+C
sollte dann doch der Prozess und Childs enden...

Mich wundert es nur das es an der "realen" Console
geht, aber so in einer Funktion nicht...

Was mache ich hier falsch oder uebersehe ich hier?

vgl.:
GenerateConsoleCtrlEvent
http://msdn.microsoft.com/en-us/library/ms683155(VS.85).aspx
Process Creation Flags
http://msdn.microsoft.com/en-us/library/ms684863(VS.85).aspx

Thomas
 

Lesen sie die antworten

#1 René König
26/05/2008 - 23:02 | Warnen spam
Hallo!

Wenn ich die von Dir verlinkte Dokumentation zu GenerateConsoleCtrlEvent
lese, so finde ich in der Beschreibung des zweiten Parameters dieses
hier: "The *identifier* of the process group to receive the signal."

Du übergibst hier aber das HANDLE, nicht den Identifier. Den Identifier
hast Du bereits in der PROCESS_INFORMATION Struktur, denn: "The process
identifier of the new process is also the process group identifier of a
new process group."

Demnach vermute ich, dass das so funktioniert:
GenerateConsoleCtrlEvent(CTRL_C_EVENT, pih.dwProcessId) ;

Gruß,
René

Ähnliche fragen