Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Probleme mit system() aufrufen

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
07.07.2010, 10:26 Uhr
Lobermann



Hallo allerseits,

ich hoffe das mir hier jemand bei diesem Thema helfen kann, andere Foren waren dazu leider nicht im Stande.

Folgendes Problem:
Betriebssystem ist Slax Linux.
Wenn ich einen Prozess mit system() starte, wird dieser nach einigen Millisekunden wieder beendet.
Es sieht so aus, also wenn er, sobald er in die nächste Zeile im Code nach dem Aufruf kommt, den Prozess wieder schließt.
Habe auch schon versucht den Prozess mit system("exec myapp &") zu starten, aber auch dies wird sofort wieder beendet.

Bitte Hilfe..
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.07.2010, 13:59 Uhr
0xdeadbeef
Gott
(Operator)


Das kann ich ohne Code nicht beurteilen. system öffnet eine Shell, der der angegebene Text übergeben wird, und wartet, bis diese fertig ist. Wenn das nach einer Millisekunde der Fall ist, läuft dein Programm nicht länger.

Wenn du Daemonisieren willst, das ist ausführlich hier beschrieben.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.07.2010, 14:09 Uhr
Lobermann



Hi. danke für die Antwort.

Reicht dir wenn ich dir genau den Aufruf gebe?

das wäre dann:


C++:
system("exec /sbin/smplugin -i udp://224.1.2.55:30550 -o udp://127.0.0.1:1234 -l 4 >> /root/smlog.log &");

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.07.2010, 14:16 Uhr
0xdeadbeef
Gott
(Operator)


Was willst du denn eigentlich genau erreichen?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.07.2010, 15:30 Uhr
Lobermann



Das Programm ruft eben diese andere Programm auf (Decrypter für Multicast streams).
Daraufhin greift das Hauptprogramm auf die angegebene Loopback adresse zu währen der Decrypter im Hintergrund den Stream decryptet.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.07.2010, 15:58 Uhr
0xdeadbeef
Gott
(Operator)


Ah. Ne, dann wird das so nichts, du wirst fork/exec schon von Hand bedienen müssen. Beispielsweise so:

C++:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
  pid_t pid;

  pid = fork();

  if(pid == -1) {
    fputs("Fehler beim Forken!", stderr);
  } else if(pid == 0) {
    /* Kindprozess */
    freopen("/dev/null",       "r", stdin);
    freopen("/root/smlog.log", "a", stdout);

    execlp("smplugin", "smplugin",
           "-i", "udp://224.1.2.55:30550",
           "
-o", "udp://127.0.0.1:1234",
           "-l", "4",
           NULL);
  } else {
    /* Vaterprozess */

    /* Hier Zeug machen */

    /* Wichtig am Ende: Kindprozess sauber beenden.
     * wie das geht, kann ich dir aber nicht sagen; ich kenne smplugin nicht.
     * Schau auf jeden Fall die manpage für wait/waitpid an. */


     /* shutdown_smplugin(); */
     wait(NULL);
  }

  return 0;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 07.07.2010 um 16:03 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.07.2010, 16:24 Uhr
Lobermann



Dank dir,

beendet werden kann der Prozess nur über einen kill befehl.
Kann man nicht, bevor ein neuer Kindprozess gestartet wird, die aktuellen kinder beenden?
Normal mach ich das über die shell mit "kill -9 pID"

Teste es gleich und geb dann nochmal bescheid.

#edit

wäre ein vfork() nicht schneller?
Programm braucht normal während der laufzeit etwa 200-300MB Arbeitsspeicher

Dieser Post wurde am 07.07.2010 um 16:36 Uhr von Lobermann editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.07.2010, 16:42 Uhr
Lobermann



Noch was, du gibst ja /dev/null und die log datei frei. Ist es nicht möglich alle Dateien auf einmal freizugeben? á la " freopen "/" ... " ?
Der neue Prozess soll ja keinesfalls irgendwelche Dateien des Vaterprozesses verwenden.
Und der Vaterprozess ladet dynamisch sehr viele Dateien.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.07.2010, 16:47 Uhr
0xdeadbeef
Gott
(Operator)


Wenn du den Prozess eh abschießen musst, dafür gibt's in der signal.h eine kill-Funktion. Die pid hast du ja noch vom fork-Aufruf:

C++:
kill(pid, SIGKILL);



Unter Linux ist fork identisch mit vfork. Schaden kann's aber eigentlich nicht.

Was die Dateien angeht, ich gehe eigentlich nicht davon aus, dass smplugin bestehende Dateideskriptoren eines Vaterprozesses benutzt, von dem es nicht weiß, dass er existiert; das wäre höchst ungewöhnlich. Ich kenne aber smplugin nicht, also kann ich dir darüber wenig sagen.

Ansonsten wäre es womöglich sinnvoll, den Vaterprozess bloß Kindprozesse managen zu lassen (dadurch bleibt dieser schön schmal) und nach Bedarf sowohl smplugin als auch den eigentlichen Worker-Prozess zu spawnen. Das sind aber Designentscheidungen, die ich dir nicht abnehmen kann.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 07.07.2010 um 16:50 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
07.07.2010, 16:59 Uhr
Lobermann



Vielen Dank.

Werds gleich umsetzen, weiss aber nicht ob ich heute noch ein Rückmeldung erstatten kann.
Hast mir auf jedenfall viel weitergeholfen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


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: