Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » GNU/Linux » return int-value from a subprogram

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
12.12.2003, 09:14 Uhr
~Jochen
Gast


Hi all,
I want to write a program which runs 255 subprograms to ping all network members in parallel. To start and end the 255 subprograms I use fork which is no problem.

My Problem is, if I run the ping command how can I check if a ping has been successful or not an transfer this to my main program?

It would be glad if anybody could help me or give me a hint. Even to check íf it is successful would help me a lot.

Thanks in advance

Jochen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.12.2003, 09:49 Uhr
virtual
Sexiest Bit alive
(Operator)


Es gibt mehrere Möglichkeiten:

1. Du verwendest eine Datei. Die Unterprogramme schreiben in in diese Datei, das Hauptprogramm liest daraus. Ist ziemlich einfach zu bewerkstelligen.

2. Wenn es nur um die Information geht, ob ping funktioniert oder nicht, kann es auch ausreichend sein, dies über einen entsprechenden Exitstatus des Childprogramms and das Mainprogramm zu signalisieren

3. Du arbeitest mit Sockets und läßt der Server an einem Socket auf Messages von den Childs warten.

4. Du verwendest Shared Memory, um ziwschen Child und Main die Daten auszutauschen.

5. Du machst alles in dem Mainprogramm, verzichtest auf die Subprozesse und machst Deine Abfragen in Threads.

6. Du verwendest eine Namedpipe, wobei die Childs schreiben, das Mainprogramm liest.

7. Vermutlich habe ich einige Möglichkeiten vergessen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.12.2003, 10:15 Uhr
~Jochen
Gast


Danke für die vielen Möglichkeiten,

wie kann ich mit Hilfe der bash shell eine 0 oder 1 erhalten, wenn der ping command erfolgreich war oder nicht?

Jochen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.12.2003, 10:24 Uhr
virtual
Sexiest Bit alive
(Operator)


% ping blabla
% echo $?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.12.2003, 10:52 Uhr
~Jochen
Gast


Ok, ich bekomme den Wert 0 oder 1. Kann ich diesen irgendwie mit dem sighandler_t aus der signal.h datei abfragen?

Gruß

Jochen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.12.2003, 11:07 Uhr
virtual
Sexiest Bit alive
(Operator)


, paßt besser ins Linux forum.

Im Hauptprogramm solltest Ja einen Signalhandler haben, der darauf reagiert, wenn die Childs sich beendet haben. Normalerweise wird man dort wait oder waitpid aufrufen (in deinem Falle eher wait). wait gibt neben der pid auch den Exitstatus des Childs zurück. Da steht dann eben 0 oder 1 oder was auch immer drin. 0 => OK, wasauchimmer => nicht okay
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.12.2003, 11:47 Uhr
~Jochen
Gast


Danke für den exit status. Das habe ich jetzt kapiert und bekomme es auch hin, diesen abzufragen. Allerdings habe ich noch folgendes Problem:

Ich versuch mit dem Befehl
execv("ping 192.168.0.1 -c1,NULL); zu pingen. wie kann ich denn von dort den wert 0 oder 1 zum Hauptprogramm zurückgeben?

Danke

Jochen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.12.2003, 12:51 Uhr
virtual
Sexiest Bit alive
(Operator)


execv bewirkt, daß der Code des Childprocesses durch den von ping ersetzt wird. Daher ist der Exitstatus von deinem Child identisch mit dem vom ping. Wie du den abfangen kannst, wurde in Post 005 erklärt:
Etwas sowas müsste im Signalhandler erscheinen:

C++:
int exit_status;
pid_t child = wait(&exit_status);


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.12.2003, 12:51 Uhr
RHBaum



von virtuals vorschlaegen wuerd ich variante 5 oder 6 bevorzugen ... in der Microsoft Welt sowieso 5 :p

execv("ping 192.168.0.1 -c1,NULL) -> genau das wuerd ich nicht machen ....
Mach dir die muehe und schau dir internas des IP Protokolls an ! implementier die ping funktionaliataet selber, oder benutz ne biblio, die dir das zur verfuegung stellt, auf c(++) ebene ...
nen prozess hochziehen und um darin ping zu starten ... bringt dir auf lange sicht mehr probleme ....
Im internet sollte es genug beispiele geben, wie man nen ping selber macht ...

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
12.12.2003, 12:56 Uhr
~Jochen
Gast


Mein Problem ist, ich muss es über ein subprogram mit der Funktion execv machen. Die großen Probleme die das bringt sehe ich gerade. Ich habe soweit alles verstanden lediglich das Abfragen des 0 oder 1 Wertes fehlt mir. Danach könnte ích das Program basteln. Evtl. benötige ich noch einen Befehl der wartet bis die Funktion execv komplett ausgführt wurde.

Trotzdem danke für die Antwort

Jochen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ GNU/Linux ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: