Aus einem Programm Funktionen starten

  • Hallo Leute,

    ich unternehme gerade meinen ersten Gehversuche mit dem Raspberry und eigener Programmierung da drauf.

    Nun stehe ich vor folgendem Problem:
    Gehe ich über die Console in einen bestimmten Ordner und gebe dann in die Console "sudo ./send xxxxxxx" ein, dann funktioniert alles wunderbar.

    Nun will ich mir aber ein Programm basten, welches dann läuft um eben in Abhängigkeit von verschiedenen Parametern das "xxxxxxx" in dem Kommando ändert.


    Wie gestalte ich mein C-Programm nun, dass genau das aufgerufen wird?


    Schon einmal besten Dank vorab!

    Gruß, ergo

  • Servus erg0,
    also nur um mit popen() o.ä. andere Programme aufzurufen schreibt man kein C-Programm ...
    Das ist nicht nur grottenschlechter Programmierstil, sondern da tut's ein bash-script genau so und ist vermutlich sogar noch effektiver und resourcenschonender.

    cu,
    -ds-

  • Hallo erg0

    Was Du da vor hast, geht mit der Anweisung "system ()".
    .
    Nehmen wir einmal an, Du hast ein Programm "Dreiecksflaeche".
    Dieses Programm benötigt als Parameter drei Seitenlängen a, b, c

    Das Programm läge im Ordner:
    /root/Dokumente

    Das Starten des Programms "Dreiecksflaeche" in der Console sähe wie folgt aus:
    ./Dreiecksflaeche 22,34 23,03 9,8

    Seine Antwort wäre:
    a = 22,340000 ; b = 23,030000 ; c = 9,800000 ; A = 108,263077

    Der C-Code zum Starten des Programms sieht dann so aus:

    #include <unistd.h>

    //static const char TransferVerzeichnis[] = "/media/ramdisk/"; // RAM_Disk für Daten
    static const char Arbeits_Verzeichnis[] = "/root/Dokumente"; // Verzeichnis in welchem sich "Dreiecksflaeche" befindet

    int DeineFunktion ( ........ )
    {
    char Verzeichnis[1002];

    ....
    ....
         
    getcwd (Verzeichnis, 1000); // aktuelles Arbeitsverzeichnis sichern
    chdir (Arbeits_Verzeichnis); // in dasjenige Verzeichnis wechseln, in welchem sich "Dreiecksflaeche" befindet
    // "Arbeits_Verzeichnis" ist weiter oben deklariert und initialisiert

    system ("sudo ./Dreiecksflaeche 22,34 23,03 9,8\n"); // Bei dieser Art Aufruf wartet "DeineFunktion" an dieser Stelle, bis "Dreiecksflaeche" fertig ist.
    system ("sudo ./Dreiecksflaeche 22,34 23,03 9,8 &\n"); // Bei dieser Art Aufruf wird "Dreiecksflaeche" gestartet, "DeineFunktion" macht aber sofort weiter.

    chdir (Verzeichnis); // in Verzeichnis zurück, wie es bei Programmeintritt war

    return 0;
    }

    Ein Problem kann jetzt sein, dass so die Flächenberechnung von "Dreiecksflaeche" ins Nirwana geht.
    Falls die Ausgabe von "Dreiecksflaeche" ausgewertet werden soll, kann man die Bildschirmanzeige in eine Datei umleiten.
    Dazu sähe der Systemaufruf wie folgt aus:

    system ("sudo ./Dreiecksflaeche 22,34 23,03 9,8 > /media/ramdisk/Flaeche.txt &\n"); // Die Datei Flaeche.txt enthält nur das letzte Ergebnis
    oder
    system ("sudo ./Dreiecksflaeche 22,34 23,03 9,8 >> /media/ramdisk/Flaeche.txt &\n"); // das letzte Ergebnis wird in "Flaeche.txt" hinten angehängt

    Das Verzeichnis "/media/ramdisk" ist natürlich nur beispielhaft. Bei exessiver Nutzung sollte man überlegen, eine RAM-Disk anzulegen, um die SD-Karte zu schonen.
    Zum einen ist eine RAM-Disk wesentlich schneller, zum anderen ist die Anzahl der Schreibzyklen auf eine SD-Karte begrenzt.

    Selbstverständlich kannst Du der Anweisung "system (char*)" auch einen String übergeben, welchen Du vorab entsprechend bearbeitet hast.


    Mit freundlichen Grüßen

    Einmal editiert, zuletzt von Prittzl (2. September 2017 um 13:36)

Jetzt mitmachen!

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