child process killen wenn parent process gekilled wird -> möglich?



  • Hallo
    Ich hab ein problem und weiss nicht ob das möglich ist...

    Ich habe ein Render-tool(Gui) welches mehrere Rendernodes(CLI) per kommandozeile steuert.
    Nun bin ich grad dran ein zusatztool zu schreiben das zwischen den beiden programmen die kommandozeilen-parameter etwas modifizert.

    Das Problem ist nun das ich im Render-Tool alle Rendernodes killen kann falls diese hängen und
    wenn ich das mache wird natürlich nur mein programm gekilled und nicht das renderprogramm(cli) ..
    Was ich erfahren habe ist das hierbei das windows-tool taskkill.exe verwendet wird.

    Momentan modifiziere ich die kommandozeile und rufe das render-programm mit
    CreateProcess neu auf.

    FRAGE:
    ist es möglich mit CreateProcess den neuen child process automatisch zu killen
    wenn mein tool (parent) gekilled wird?
    Bei dem renderprogrammen selber kann ich natürlich nichts ändern..
    und die funktion atexit() wird nach dem killen auch nicht aufgerufen 😞

    Hab nur ein paar infos gefunden die das selbe thema haben.
    http://serverfault.com/questions/151196/how-is-the-windows-kill-process-works
    http://www.codeguru.com/forum/archive/index.php/t-379071.html
    http://www.microsoft.com/msj/0698/win320698.aspx

    Hier noch kurz wie ich einen child-prozess erzeuge

    int start_render(char path[], char cmd[])
    {
        DWORD dwExitCode=9999;
        int proc_stat;
    
        PROCESS_INFORMATION pi;
        STARTUPINFO si;
        memset(&si, 0, sizeof(si));
        memset(&pi, 0, sizeof(pi));
        si.cb = sizeof(si);
    
        proc_stat=CreateProcess( path,                  //  module name
                                     cmd,	        // Command line.
                                     NULL,             // Process handle not inheritable.
                                     NULL,             // Thread handle not inheritable.
                                     FALSE,             // Set handle inheritance to FALSE.
                                     CREATE_NEW_CONSOLE, // 0 -> No creation flags. or CREATE_NEW_CONSOLE
                                     NULL,             // Use parent's environment block.
                                     NULL,             // Use parent's starting directory.
                                     &si,              // Pointer to STARTUPINFO structure.
                                     &pi );             // Pointer to PROCESS_INFORMATION structure.
    
            if (proc_stat !=0)
            {
                GetExitCodeProcess(pi.hProcess, &dwExitCode);
                while (dwExitCode != WAIT_OBJECT_0)          // oder STILL_ACTIVE für GetExitCodeProcess()
                {
    
                    dwExitCode=WaitForSingleObject(pi.hProcess,1000);    // hier stoppt die schleife
    
                }
                printf("\n>>> Rendering has finished with Exit-Code:%x  (0=OK)\n",(int)dwExitCode);
    
            }
            else
            {
                printf("\nERROR:  could not start render ");
                printf("\n        proc_stat: %i",proc_stat);
                printf("\n        GetLastError: %lu\n",GetLastError());
            }
    
            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
    
        printf("\ndwExitCode1: %i \n",(int)dwExitCode);
    
        return dwExitCode;
    
    }
    

    EDIT:
    Der Beitrag wäre wohl besser bei "DOS und Win32-Konsole" zu verschieben 🙂



  • Möglich wäre es z.B. so, auch wenn das nicht wirklich schön ist, da hierbei kein Speicherplatz von DLLs freigegeben wird (->Speichelöcher).

    TerminateProcess( HANDLE hProcess, UINT uExitCode );
    


  • ja hab ich schon probiert..
    das problem ist ja, dass wenn das parent mit taskkill beendet wird, kann ich nicht zusätzlich TerminateProcess ausführen..

    oder gibt es eine möglichkeit, dass wenn das parent gekillt wird, ich noch sowas ähnliches wie atexit() ausführen lassen kann?
    dann könnte ich natürlich als letztes kommando mit TerminateProcess() meinen child-prozess killen?



  • Achso - jetzt verstehe ich 😃
    Nein - das ist ein sofortiges beenden.
    Und wenn du einfach eine WM_QUIT Nachricht sendest um dein Programm zu killen? Dann könntest du einfach nach der Hauptschleife deine child-prozesse auch noch killen.



  • auch noch wach? 🙂
    1. ich hab eine konsolenanwendung und da wird eine WM_QUIT Nachricht wohl nicht gehen.

    2. wie ich das programm kille kann ich leider nicht aussuchen, da sozusagen das proprietär gui-programm beim killen immer einen killtask.exe aufruf macht, den es über das netzwerk verschickt.. also ich kann da nichts beeinflussen..

    aber mir ist grad die idee gekommen, das es eventuell mit einem weiteren programm gehen könnte, das ich als überwachung von meinem 1. programm verwenden könnte?
    wird aber etwas kompliziert 🙂

    (proprietäre-gui) -> taskkill -> (mein überwachuns-tool wird gekillt) ->
    -> (mein zweites tool erkennt das fehlen des überwachuns-tool ) ->
    (mein zweites tool killt den proprietäre render-node) -> (proprietäre render-node wurde gekilled) -> alles wurde beendet...

    ohne meine modifikationen würde das programm normalerweise so laufen:
    (proprietäre-gui) -> taskkill -> (proprietäre render-node wurde gekilled)

    hoff die idee ist verständlich 🙂
    wäre natrülich besser wenns anderst gehen würde


Log in to reply