Programme mit C-Programm starten lassen

  • Hallo Leute,

    kann mir wer sagen wie ich mithilfe meines C-Programms andere C-Programme am RPi B+ starten lassen kann?
    Beispiel: Ich habe ein Programm geschrieben dass ankommende SMS auswertet und auf verschiedene Schlüsselwörter verschiedenartig reagiert. Für jedes Schlüsselwort steht ein anderes Programm zur Verfügung. Eines davon wäre z.b. ein Programm welches Schieberegister ansteuert, die wiederum einen LED Cube zum Blinken bringen. Da ich diesen Programmcode nicht direkt in mein "Hauptprogramm" schreiben will, da die SMS auswertung ja sonst blockiert für die dauer der ansteuerung des LED Cubes möchte ich es also so haben, dass ich das Programm zur ansteuerung des LED Cubes im Hauptprogramm nur starte und das Hauptprogramm dann gleich wieder weiterläuft.
    Gibt es hierfür bereits einen Beitrag? ich habe leider nichts passendes gefunden..

    mfg Marko

  • Hallo Marko,

    aus einem C-Programm kannst Du andere Programme mit dem Befehl [font="Courier New"]system()[/font] aufrufen.

    Wenn Du möchtest, dass Dein dem C-Programm auf das Ende des aufgerufenen Programms warten soll, dann so:

    Code
    system("/Pfad/zu/Deinem/Programm/programmname Liste_der_Argumente")

    Wenn sowohl Dein C-Programm als auch das aufgerufene Programm parallel weiterlaufen sollen, dann so:

    Code
    system("/Pfad/zu/Deinem/Programm/programmname Liste_der_Argumente &")

    Und wenn Dein aufgerufenes Programm Root-Rechte benötigt, dann kommt vor den Pfad noch ein schlichtes [font="Courier New"]sudo[/font].

    Alternativ geht das noch mit einer Kombination von [font="Courier New"]fork()[/font], [font="Courier New"]exec([/font]) und [font="Courier New"]waitpid()[/font]. [font="Courier New"]system()[/font] macht aber prinzipiell das Gleiche.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (12. September 2015 um 19:33)

  • Hallo Marko,

    angenommen, Du willst Deinem compilierten C-Programm Argumente / Parameter übergeben.

    Beispiel: Du möchtest das Linux-Kommando [font="Courier New"]ls[/font] aufrufen, um die Verzeichnisse im aktuellen Verzeichnis anzuzeigen. Bei diesem Linux-Kommando gibt es z.B. das Argument [font="Courier New"]-all[/font].

    Dann würde in Deinem Progrmm eine Zeile stehen wie:

    Code
    system("/bin/ls -all");

    Übrigens kannst Du Dir in der Regel den Pfad zu den aufzufrufenden Programmen sparen, wenn sich diese in Verzeichnissen befinden, die in der Umgebungsungsvariablen [font="Courier New"]PATH[/font] enthalten sind.

    Welche das sind, verrät Dir

    Code
    echo $PATH

    oder in Deinem C-Programm jetzt ;) :

    Code
    system("echo $PATH");

    Den Pfad zu Programmen kannst Du herausfinden, indem Du folgendes eingibst

    Code
    which Programmname

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (12. September 2015 um 19:33)

  • Hallo Marko,


    Oke vielen Dank!
    Und wenn ich das richtig verstehe muss ich nicht zwangsläufig argumente angeben, wenn ich keine habe oder?

    ... oder wo nix is, da is nix...

    Läuft es denn jetzt?

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo Andreas,

    ja funktioniert alles bestens!
    gibt es eigentlich auch die Möglichkeit ein bereits gestartetes Programm Programmtechnisch abzuschießen, bzw. es während seiner Laufzeit vom "Hauptprogramm" aus zu beenden?

    mfg Marko

  • Hallo Marko,

    da gibt es im Wesentlichen zwei Möglichkeiten.

    Entweder Du besorgst Dir mittels des Linux-Kommandos [font="Courier New"]pidof[/font] die Prozess-ID Deines über [font="Courier New"]system()[/font] gestarteten Programmes und beseitigst es über das Linux-Kommando [font="Courier New"]kill[/font] - oder Du entfernst es gleich über den Namen.

    Wenn Du allerdings mehrere gleichnamige Programme gestartet hast, würdest Du mit [font="Courier New"]kill[/font] alle gleichzeitig löschen.

    Wenn das nicht gewünscht ist, dann eben mit der Kombination [font="Courier New"]pidof[/font] / [font="Courier New"]kill[/font].

    Wenn Du mehr über die Linux-Kommandos wissen möchtest, dann gib mal im Terminal-Programm ein

    Code
    man pidof


    und

    Code
    man kill


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (12. September 2015 um 22:59)

  • Hallo,

    Oke vielen Dank für deine Hilfe!

    Lg Marko
    Automatisch zusammengefügt:
    Muss ich diesen "kill-befehl" im c programm dann auch wieder mit "system("")" anwenden?

    Einmal editiert, zuletzt von markob39 (12. September 2015 um 23:08)

  • Hallo Marko,

    klar! Du musst aber auf die "" achten... Aber hier brauchst Du auf jeden Fall ein Argument - nämlich das zu beseitigende Programm.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (12. September 2015 um 23:28)

  • Also mal ganz ehrlich: das ist grottenschlechter Programmierstil ein C-Programm zu erstellen, das größtenteils nur aus system() Aufrufen besteht. Das sollte man
    1. als Helfer niemanden raten und
    2. als Fragesteller sich erst gar nicht angewöhnen.

    Einfachster Weg: ein bash-script, der irgendwelche Parameter abprüft und abhängug davon die einzelnen Programme aufruft.
    Oder: falls man - wie erwähnt - die Kontrolle über die gestarteten Prozesse behalten will, fork()/exec() verwenden.
    Und wenn Du was lernen willst, dann verwendest Du pthreads und machst das ganze über multithreading. Letzteres wäre imho die sauberste Vorgehensweise.

    cu,
    -ds-

  • Hallo Dreamshader,

    Du hast ja Recht. Aber ob das Programm größtenteils aus system()-Aufrufen besteht ist nicht klar, denn das Programm steht ja im Wesentlichen schon - es fehlten nur noch ein paar Dinge, die sich mit system() lösen lassen.

    Ich persönlich halte es für wichtiger, einen Programmierneuling dort abzuholen, wo er sich gerade befindet, um einen Fortschritt zu ermöglichen.

    Mit Konzepten / neuen Techniken, die der TE noch nicht kennt, zu kommen, würde bedeuten, dass wir dann hier auch gleich den Rest der Software programmieren - und der TE ganz schnell nur noch Bahnhof versteht.

    Die Motivation bleibt auf der Strecke, und die Gefahr wächst, dass hier weiterhin immer wieder fertige Lösungen eingefordert werden.

    Wieder nur meine persönliche Meinung: pthreads / Multithreading übersteigt wohl das Verständnis von Programmieranfängern.

    Lasse Marko mal seine Idee umsetzen - irgendwann kommt er dann zu anspruchsvolleren Techniken.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo,

    ja mir ist Multithreading und dergleichen durchaus bekannt da ich auch in Java ein Programme schreibe.. Das Problem ist hier hauptsächlich, dass ich mir derzeit schwer tue das alles auf C bzw. auf Raspbian umzusetzen weil ich damit einfach noch wenig bis gar keine Erfahrung habe!

    aber danke ich werde mich bezüglich dieser Tipps weiter informieren und recherchieren!

    mfg Marko

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!