waitpid() prüfen ob der Prozess noch läuft



  • ich habe einen TCP Server. Dieser erstellt bei einer anfrage mit fork() ein Kind Prozess und schießt seine Verbindung dann wieder. Der Sohn übernimmt das antworten auf die anfrage(Datenstream).

    Bevor der Server einen neuen Sohn Prozess startet muss ich sicherstellen, dass da nicht noch ein Kinnprozess am streamen ist.(eine Ressource, ein Datenstrom, sonst gibt es Dateninkonsistenzen)

    Ich möchte also mit waitpid() den bereits beendeten Zombi terminieren oder wenn der Prozess noch läuft diesen mit einem Signal beenden.

    wie mache ich das am besten? den Zombi zu terminieren ist einfach. Aber wie erkenne ich, dass da noch ein Prozess am laufen ist und wie schicke ich ihm ein Signal, sodass er vernünftig beendet wird?



  • Mit seiner PID.

    man7.org schrieb:

    On success, the PID of the child process is returned in the parent,
    and 0 is returned in the child. On failure, -1 is returned in the
    parent, no child process is created, and errno is set appropriately.



  • Dieser Thread wurde von Moderator/in Arcoth aus dem Forum C++ (alle ISO-Standards) in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ich habe viel herum gespielt und viel ausprobiert.
    Das ist meine vorläufige Lösung:

    pid_t  pid=0;
    
    ...
    kill_child();
    pid = fork();	
    switch( pid )	
    {
    ...
    
    void kill_child(void)
    {
    	pid_t ret_pid;
    	printf("TIDASERVER: %s() \n",__FUNCTION__);
    
    	do
    	{
    		ret_pid = waitpid(-1,0,WNOHANG);
    		if(ret_pid == 0)
    		{
    			printf("TIDASERVER: %s: da ist noch ein kind, führe kill(%d,15) aus\n",__FUNCTION__,pid);
    			kill(pid,15);
    			waitpid(pid,0,0);
    			printf("TIDASERVER: %s: Kind und Zombi sind tod\n",__FUNCTION__);
    		}
    	}while(ret_pid > 0);
    }
    

    Mit "ret_pid = waitpid(-1,0,WNOHANG);" prüfe ich ob es noch laufende Kind Prozesse gibt.
    Wenn ja, wird das zuletzt erzeugte Kind mit "kill(pid,15);" umgebracht.
    Für den Moment noch mit der Keule. Ich muss mich da noch mit den Signalen auseinandersetzen und einen Signalhändler entwerfen.

    jetzt noch ne Frage.
    Kann man die PID von noch laufenden Kind Prozessen ermitteln?



  • Am einfachsten wäre es wohl wenn du die PID's, die dir fork() zurückgibt einfach zwischenspeicherst.

    Andernfalls musst du im proc-Dateisystem rumwühlen.