Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » GNU/Linux » Aufruf eines C-programmes

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 <
000
28.01.2004, 09:24 Uhr
~Ölie
Gast


Hallo,

wie lässt sich aus einem laufenden C-Programm, ein weiteres C-Prg. starten? Beide Programme sind voneinander völlig unabhängig und liegen in unterschiedlichen Verzeichnissen. Das ganze läuft unter Linux. Meine Idee war, mit Hilfe von system("*"); wobei * für den Programmaufruf steht.

Gruss Ölie
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.01.2004, 09:57 Uhr
typecast
aka loddab
(Operator)


Ja das funktioniert. Unter Linux gibt es aber auch noch andere Möglichkeiten. Ich verschieb diesen Thread mal dahin und erzähl dir dann von den anderen.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.01.2004, 09:59 Uhr
virtual
Sexiest Bit alive
(Operator)


Nicht mit ANSI C machbar =>

Generell wirst Du zunächst forken müssen und dann mit execl oder einer verwandten Routine das Programm ausführen müssen. Zu beachten:

1. Du solltest ggf. zweimal forken, weil sonst das Child ein Zombie wird, wenn es kürzer als das Parent läuft. Um dies zu verhindern forkt man zweimal, also einaml den Parent Process forken und danach das Child forken. Das Grandchild führt das Programm aus, das erste child sollte sofort sterben und Parent sollte mit waitpid darauf warten

2. Komplett unabh. beudetet auch, daß Du ggf. die Ein/Ausgabe Kanäle im child umleiten mußt.
--
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
003
28.01.2004, 10:00 Uhr
virtual
Sexiest Bit alive
(Operator)


Eine einfache Möglichkeit besteht darin, mit popen zu arbeiten...
--
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
28.01.2004, 10:05 Uhr
typecast
aka loddab
(Operator)


So du kannst mir fork einen neuen Kindprozess erzeugen und dieses dann mit einer der exec Funktionen mit einem anderen Programm überlagern. Mehr dazu findest du unter

Code:
$ man 3 exec


zu frok() findest du unter

Code:
$ man fork


noch weitere Hilfe

Hier mal ein Beispiel:

C++:
pid_t pid

if (0 == (pid = fork()))
  {
     // das hier ist der Code des Childprozesses
     execl(messenger, " ", "Es hat sich ein User ausgeloggt");
     // Da die exec-Funktionen nur im Fehlerfall zurückkehren, kann hier eine Fehlerbehandlung stattfinden
     perror("Fehler bei der Meldung");
     exit(1);
  }
else if (pid == -1)
       {
           // es gab beim erzeugen des Kindprozesses einen Fehler
       }
       else
       {
           // hier kommt der Code deines Vaterprozesses rein
           // dieses else kann hier auch weggelassen werden, da der Kindprozess nie soweit kommt
       }



Ich hoffe das hilft dir weiter. Wenn du noch Fragen hast, dann melde dich noch mal
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
28.01.2004, 11:10 Uhr
~Ölie
Gast


Erst einmal vielen Dank für Eure Mühe, aber ich dachte das Ganze könnte einfacher gelöst werden. Ohne Threads und fork-Funktionen. Zum Verständnis vielleicht nocheinmal, die Programme sind jeweils eigenständig und können separat aufgerufen werden.

Ich kann z. B. System Funktionen folgendermaßen Aufrufen:

system(sleep(1));

Ich dachte an eine ähnliche Lösung!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
28.01.2004, 12:22 Uhr
typecast
aka loddab
(Operator)


Entweder System oder fork. Andere Möglichkeiten fallen mir nicht ein. Außerdem muss es in deinem Beispiel

C++:
sytem("sleep 1");


heißen
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)

Dieser Post wurde am 28.01.2004 um 22:02 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: