Prozesse: Vater wartet 1 sekunde auf Kind und killed es dann.

Post Reply
Message
Author
User avatar
Lateralus
prolinux-forum-admin
Posts: 1238
Joined: 05. May 2004 7:35

Prozesse: Vater wartet 1 sekunde auf Kind und killed es dann.

#1 Post by Lateralus »

Ich habe ein kleines Problem in C

Ich möchte ein Programm schreiben, dass 1. forked() 2. der Elternprozess eine bestimmte Zeitlang wartet, und dann das Kind killed, aber nur wenn es sich nicht selbst bereits beendet hat. Wenn das Kind sich schon beendet hat, soll der Elternprozess weiterlaufen. (Das folgende Programm erfüllt die Aufgabe also nicht.)

Code: Select all

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

int main&#40;&#41;
&#123;
	pid_t pid;

	if&#40; &#40;pid=fork&#40;&#41;&#41; == 0&#41;&#123;
		while&#40;1&#41;&#123;
			if&#40; &#40;rand&#40;&#41;&#41; < &#40;RAND_MAX/1000&#41;*999 &#41;
				printf&#40;"Ich bin das Kind, ich spiele!\n"&#41;;
			else&#123;
				printf&#40;"Aber vielleicht beende ich mich auch!\n"&#41;;
				exit&#40;0&#41;;
			&#125;

		&#125;
	&#125;

	if&#40; pid > 0&#41;&#123;
		sleep&#40;1&#41;;
		kill&#40;pid, SIGQUIT&#41;;
	&#125;

	if&#40; pid < 0&#41;&#123;
		fprintf&#40;stderr, "fork&#40;&#41; fuehrte zu einem Fehler!\n"&#41;;
		exit&#40;1&#41;;
	&#125;

	return 0;

&#125;

_MP_
Posts: 45
Joined: 04. Sep 2004 10:35

#2 Post by _MP_ »

Was spricht denn gegen die aktuelle Version deines Programmes? Die (eventuell ehemalige) PID des Childprozesses kannst du doch mit einem kill() verwenden. Ist der Prozeß nicht mehr da, macht es nix und wenn er da ist, wird er halt beendet. Ich glaube jedenfalls nicht, dass die realistische Gefahr besteht, dass innerhalb dieser <1 sec die 65534 anderen, möglichen PIDs verbraucht werden und es plötzlich wieder einen Prozeß mit der gleichen PID gibt.

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#3 Post by jochen »

Ansonsten suchst Du wohl wait(2) mit Option WNOHANG (wenn ich die Manual Page nicht falsch interpretiert habe). Damit kann man darauf warten, dass sich ein Prozess mit einer gegebenen PID beendet. Durch WNOHANG sollte der Aufruf mit Returncode 0 direkt wiederkommen, ansonsten ist der Returncode die PID des ehemaligen Child-Prozesses.

Jochen
Die grösste Lüge der EDV? "Mal eben..."

User avatar
Lateralus
prolinux-forum-admin
Posts: 1238
Joined: 05. May 2004 7:35

#4 Post by Lateralus »

Erst mal danke für die Hilfe, aber es ist noch nicht ganz das, was ich will.

Das Beispiel war wie gesagt nur ein Beispiel. Es geht im konkreten um einen TCP-Connect-Portscanner. Das Problem ist, dass bei gefilterten Ports keine Antwort kommt, der Kindprozess (welcher einen socket zum port öffnet) also bis in alle Ewigkeit wartet. Bei einer Antwort kommt diese aber meist innerhalb von (naja kommt auf den traffic im Netz an, aber) sagen wir mal 200 Millisekunden. Wenn ich aber eine Sekunde lang warte verschwende ich Zeit, was bei 2^16 Ports stressig wird. Deshalb darf 1. der Vater nicht warten, bis das Kind sich selbst beendet hat und 2. der Vater aber auch nicht genau eine Sekunden warten, weil sich das Kind dann vielleicht inzwischen beendet hat.

wait erfüllt deshalb meine Ansprüche meiner Meinung nach nicht.

edit: Ist es vielleicht möglich, dass das Kind dem Elternprozess ein Signal schickt und dieser darauf sleep() seien lässt und zur nächsten Zeile Code springt?

_MP_
Posts: 45
Joined: 04. Sep 2004 10:35

#5 Post by _MP_ »

Ähm - wie? wait() wartet mit oben genannter Option nicht - also wo ist das Problem?

User avatar
Lateralus
prolinux-forum-admin
Posts: 1238
Joined: 05. May 2004 7:35

#6 Post by Lateralus »

Um ehrlich zu sein: Ich habe keine Ahnung. Ich arbeite zum ersten mal mit Prozessen, würdest du dir die Mühe machen, ein bisschen Code zu posten?

Udo Maslo

#7 Post by Udo Maslo »

Lateralus wrote: Das Problem ist, dass bei gefilterten Ports keine Antwort kommt, der Kindprozess (welcher einen socket zum port öffnet) also bis in alle Ewigkeit wartet.
Warum ist der so blöd und wartet ewig? Und wenn es wirklich so blöde Dinge gibt, kann man ja alarm schlagen.

Udo Maslo

#8 Post by Udo Maslo »

Habe gerade etwas anderes von Lateralus gelesen:

Segmentation fault und Großes Fragezeichen in Bezug auf malloc

Da komme ich doch erstmal zu dem Schluß, er sollte noch eine Weile üben, ehe er sich mit palallel-verarbeitenden Dingen (nur so wird es was ordentliches) beschäftigt.
Bei seinem Design muß ja einfach damit gerechnet werden, daß es 2^16s dauert, wobei 1s ja fast zu kurz ist.

Und dann noch solche Annahmen:
(na gut, 640kB Arbeitsspeicher reichen ja auch ...)
Was spricht denn gegen die aktuelle Version deines Programmes? Die (eventuell ehemalige) PID des Childprozesses kannst du doch mit einem kill() verwenden. Ist der Prozeß nicht mehr da, macht es nix und wenn er da ist, wird er halt beendet. Ich glaube jedenfalls nicht, dass die realistische Gefahr besteht, dass innerhalb dieser <1 sec die 65534 anderen, möglichen PIDs verbraucht werden und es plötzlich wieder einen Prozeß mit der gleichen PID gibt.
Für solchen Schwachfug gehört man gekreuzigt! Leider scheint bei einem Großteil von GNU-Linux-Programmen ähnliches Gedankengut inne zu wohnen! Inzwischen glaube ich fast, MS hat mit seiner TCO-Werbung recht, ich kenne ich den ganzen MS-Kram nicht so recht, werde es wohl aber bald probieren.

_MP_
Posts: 45
Joined: 04. Sep 2004 10:35

#9 Post by _MP_ »

Hm, was kriecht um 4.33 Uhr nun eigentlich aus den Löchern: die Besoffenen oder die Trolle? Papas 12jähriger größenwahnsinniger Sohn wird es um die Zeit ja kaum noch sein...

User avatar
Lateralus
prolinux-forum-admin
Posts: 1238
Joined: 05. May 2004 7:35

#10 Post by Lateralus »

Hi Udo

Vielen Dank für die Antwort. In der Tat übe ich gerade. Was hat Speicherverwaltung mit Prozessverwaltung zu tun?

Du scheinst ja das Wissen zu haben, mir zu helfen. Würdest du es bitte auch posten, dann kämen wir auch zurück zum Thema.

klopskuchen
prolinux-forum-admin
Posts: 1444
Joined: 26. Jun 2004 21:18
Contact:

#11 Post by klopskuchen »

Udo Maslo schrieb:
> Habe gerade etwas anderes von Lateralus gelesen:

ARSCHLOCH
When all else fails, read the instructions .

Post Reply