shell Befehle in C ausführen

  • Hallo guten Abend zusammen.

    Ich suche eine Möglichkeit shell Befehle von C aus aufzurufen.

    Ich habe nen Temperaturfühler DS18S20 im Einsatz.

    Das Teil kann ich in der shell mit "modprobe w1-therm" aufrufen.
    Es wird dann eine File /sys/bus/w1/devices/xxxxxxxxx/w1_slave erstellt"
    xxxxxxxx ist die ID des Sensors.
    In diesem File steht u.a. die gemessene Temperatur.

    Das File mit C zu bearbeiten ist nicht das Problem.

    Nur... wie rufe ich "modprobe w1-therm" auf ?

    Hab da nichts gefunden.
    In Python geht es, aber das will ich nicht.

    besten Dank im voraus.

    mfg

  • C , C# oder C++ ?

    Mit modprobe wird nur das Treiber Module geladen

    Ich würd an deiner Stelle also entweder prüfen ob das Module geladen ist und erst dann versuchen zu laden - oder prüfen ob die virtuelle Datei /sys/bus/w1/devices/*/w1_slave existiert und wenn nicht das Module zu laden..

    system() oder popen() wäre in C++ die Anweisung zum ausführen von Shell Befehlen


  • Hab da nichts gefunden.

    Könnte das auch daran liegen dass Du nicht gesucht hast? Wenn ich "execute shell command c" in Google eintippe bekomme ich 6.5 Millionen hits inclusive Youtube-Tutorials...

    Zitat von dreamshader



    da kannst Du z.B.:
    exec(), execvp(), system(), popen() ...
    verwenden.

    Wenn Du exec und Verwandte verwendest kommst Du nicht mehr zurück in Dein Programm und popen brauchst Du nicht weil Dich die Ausgabe von modprobe nicht interessiert.

    Nimm system - und für modprobe brauchst Du root-Rechte, also noch ein sudo davor (Du lässt doch nicht das ganze Programm als root laufen oder?)

    btw: Wenn Dein Sensor eh' immer dran hängt wäre es vielleicht eine bessere Idee das Modul in /etc/modules einzutragen - dann wird es beim boot automatisch geladen und Dein Programm muss sich nicht darum kümmern.


    In Python geht es, aber das will ich nicht.

    Wenn Du Python nicht willst wie wär's mit Perl oder Ruby oder Lua?

    Gib's zu: Dein Programm liest nicht nur die Themperatur aus, sondern Du trägst sie in eine Datenbank ein und Du machst eine schöne Grafik daraus etc.

    Das machen nur Masochisten in C (auch wenn's natürlich geht).

  • Hallo, erstmal Danke für die Antworten.

    Ein paar Erklärungen dazu :
    @ meigrafd

    Zitat


    Mit modprobe wird nur das Treiber Module geladen

    Ich würd an deiner Stelle also entweder prüfen ob das Module geladen ist und erst dann versuchen zu laden - oder prüfen ob die virtuelle Datei /sys/bus/w1/devices/*/w1_slave existiert und wenn nicht das Module zu laden..


    das ist mir klar , sicher kann ich beim Öffnungsversuch des Files abchecken, ob das erfolgreich war.

    den Treiber automatisch zu laden , ist auch kein Problem.

    Code
    sudo echo >> /etc/modules w1-gpio && sudo echo >> /etc/modules w1_therm

    @ dreamshader ..... ok, werd ich testen.

    Zitat


    exec(), execvp(), system(), popen() ...

    @ morgon

    Zitat


    Hab da nichts gefunden.


    dann hab ich falsch gesucht, ok.
    ich hab .... "raspi shell befehle in c aufrufen" eingegeben ... da kommt nichts vernünftiges, aber ok

    Zitat


    Nimm system - und für modprobe brauchst Du root-Rechte, also noch ein sudo davor (Du lässt doch nicht das ganze Programm als root laufen oder?)


    das ist korrekt, sudo ist davor.

    Zitat


    Gib's zu: Dein Programm liest nicht nur die Themperatur aus, sondern Du trägst sie in eine Datenbank ein und Du machst eine schöne Grafik daraus etc.

    Das machen nur Masochisten in C (auch wenn's natürlich geht).

    das ist falsch.
    Ein Franke wie ich es bin, würde sagen "Soua glump intressiät mich nät"

    Hintergrund ist folgender:

    Ich habe seit 5 Jahren Doppel-Solarzellen auf dem Dach (dess meines Hauses, nicht meines) ;)
    Die versorgen einen 2000 Liter Speicher, aus dem sich wahlweise das Brauchwasser bzw. der Heizungskreislauf mit nötigem Warmwasser (so vorhanden ) versorgen.
    Das funktioniert super.
    Das Prob ist folgendes.
    Im Hochsommer hab ich heisses Wasser im Überfluss.
    Ich könnte die ganze Strasse jeden Abend zum duschen kommen lassen, die müssten nur das Wasser mitbringen.
    Die Idee, das heisse Wasser 100 Literweise schockfrieren , einlagern und im Winter schnell auftauen ist ja ok, (nach dem Motto, "heises Wasser kann mann immer mal brauchen") wenn da nicht die sch.. Physik wäre ....... :shy:

    Die Solarzellen sind umschaltbar.
    Will heisen: ich kann umschalten, ob Warmwasser oder Strom erzeugt wird.

    Die Regelung dazu will ich selbst per Software realisieren ...
    Akkus und Speicherung ist eine andere Baustelle .
    das ist der Zweck.

    Zu der C shell Befehlsübergabe ist mir nochwas eingefallen.
    Ein shells-cript kann soweit ich weiss ,zeitgesteuert ausführen.

    Da bin ich noch zu frisch in C ....... mal sehen

    Trotzdem besten Dank für die Antworten.
    Werde kurz mitteilen, wie ich das realisiert habe.

    mfg root

    Nachtrag : evtl. Rechtschreibfehler sind zwar mein Lizensiertes Eigentum, dürfen aber auch ohne meine Genehmigung weiterverwendet werden :cool:

    Einmal editiert, zuletzt von root (10. Februar 2014 um 00:37)

  • Die Leute vor C zu warnen ist in Ordnung, das mache ich ja auch :thumbs1:

    Wenn sie aber darauf bestehen, dann soll man sie machen lassen !
    Einige Leute hier haben mit kleinen Hinweisen schon erstaunliches
    geschafft.

    - - - - - -

    Ich finde eher die Ausgangslage fragwuerdig: ein Programm das
    modprobe ausfuehrt ??

    Fuer mich gehoert das zur Systemkonfiguration, und eine Applikation
    sollte die nicht aendern.


    - - - - - -

    Wenn's doch sein soll:


    Unter Unix und Linux werden Subprozesse mit fork() und exec() gestartet.
    fork macht einen neuen Prozess und exec laedt den Code fuer den Subprozess
    in den neuen Prozess.

    Im Internet findet man garantiert tausende von Beispielen dafuer, das kommt
    fast in jedem Kurs zur Unix/Linux-Programmierung vor.

    man fork und man exec direkt auf dem PI sagen auch schon einiges aus.

    system(), das hier empfohlen wurde, macht ebenfalls diese beiden Aufrufe,
    aber es hat einen deutlich hoeheren Aufwand, weil es noch eine Shell dazwischen
    schaltet. Ausserdem wartet es immer auf das Ende des Prozesses.

    Einmal editiert, zuletzt von Tell (10. Februar 2014 um 11:46)

  • Wenn Ihr nicht wollt das auf persönliche Angriffe sich nicht weiter geäußert wird, solltet ihr BEIDE dies unterlassen!

    Hier ist keine Plattform um euch gegenseitig zu beleidigen!

    Euer Fachwissen ist kein Freibrief hier Äußerungen unter der Gürtellinie zu äußern! Insbesondere @ morgon sollte sich diesbezüglich mal arg am Riemen reißen!
    Aber auch @ root sollte sich darauf nicht einlassen und nicht zurück pöbeln!

    mind. 5 Posts sind hier wirklich überflüssig! Kotzt euch bitte über PN aus aber nicht hier öffentlich! *pfui* :no_sad:

    Kindergarten! :baeh2:

  • Hallo zusammen.

    @ meigrafd, das akzeptiere ich.. kein Thema.

    Aber deswegen schreibe ich nicht.

    Die Frage zu meinem Prob. hat sich erledigt, bzw. ist geklärt.

    mit :

    Code
    pi@raspberrypi ~ $ sudo modprobe wire
    pi@raspberrypi ~ $ [b]sudo modprobe w1_gpio
    pi@raspberrypi ~ $ sudo modprobe w1_therm

    ist es getan
    Ich war der irrigen Ansicht dass man "modprobe w1-therm" jedesmal anstossen muss, um einen neuen
    Wert zu bekommen.
    Das stimmt nicht.
    Nach den 3 obigen Befehlen macht er das selbst zyklisch.
    Warum, und mit welcher Zykluszeit weiss ich noch nicht.

    Das Problem hat sich damit erledigt.
    Trotzden Danke an die vernünftigen Antworter.

    gruß root

    :D ... mhhh ich kann machen was ich will... krieg diese bold nicht weg.
    ... ich weiss... markieren, oben B clicken .... nix .... im Editor sehe ich diese blöden Zeichen nicht... von ausen schon.... egal

    Einmal editiert, zuletzt von root (11. Februar 2014 um 01:07)


  • Nach den 3 obigen Befehlen macht er das selbst zyklisch.
    Warum, und mit welcher Zykluszeit weiss ich noch nicht.

    Durch modprobe wird versucht das Kernel Treiber Modul zu laden. Das macht er ein mal und dann nie wieder - also nix zyklisch

    Damit das nach einem Reboot auch wieder geladen ist und du das nicht manuell anstoßen musst kannst du die Module eben in /etc/modules eintragen (wurde weiter oben schon zu geraten), und somit fällt es weg das über C regeln zu wollen (dirty)


    :D ... mhhh ich kann machen was ich will... krieg diese bold nicht weg.
    ... ich weiss... markieren, oben B clicken .... nix .... im Editor sehe ich diese blöden Zeichen nicht... von ausen schon.... egal

    Unten auf Beitragsvorschau klicken und dann in der Toolsleiste (über dem Beitrag) auf Quelltext ansehen - dann siehst du die BB-Codes für Bold usw und kannst es entfernen

  • Hallo @ meigrafd.

    Von der Logik her hast du vollkommen recht.
    Jetzt kommt das große ABER.

    Ich konnte es ja selbst nicht glauben, aber es ist tatsächlich so.
    Das soll nicht heißen dass die Treiber Module zyklisch neu geladen werde, was ja unsinnig wäre.

    Ich habe es in die /etc/modules eingetragen .... reboot's x-mal... es geht.

    Das war auch die ursprüngliche Frage , und meine Vermutung, dass dies "modprobe w1_therm"
    anstösst.
    Nachdem erstmal keine Lösung vorhanden war, hab ich das Prog geschrieben ... mal gucken.
    Und siehe da.

    Wer das anstoßen zum erneuten lesen .... (weiß der Geier wer das macht) und in welchem Zyklus das passiert, keine Ahnung.

    Hier das C Test-Progrämmchen, das nix weiter macht, als im Sekundentakt auszulesen.

    Ich sitze im Moment davor ... mal Finger hinhalten .... mal abkühlen lassen .... es geht

    Ich hatte in diesem Forum mit jemandem kurzen Kontakt, der auch diesen Sensor hat... in Python.
    Werde in mal diesbezüglich fragen .

    Gruß root

    Einmal editiert, zuletzt von root (12. Februar 2014 um 02:23)

  • Wer das anstoßen zum erneuten lesen .... (weiß der Geier wer das macht) und in welchem Zyklus das passiert, keine Ahnung.

    Hallo root,

    "w1_therm" startet aufgrund Deines "fopen" den Lesevorgang für den Sensor. Für jedes neue Auslesen muß deswegen auch das file geschlossen und wieder neu geöffnet werden - wie Du es ja bereits richtig machst.

    Nicht vergessen, auch auf CRC zu prüfen - es können durchaus auch Fehlmessungen passieren.

    Gruß, mmi

  • Hallo mmi.

    Das ist ein Argument.
    Klar kann ich in der ersten Zeile auf "CRC = YES" testen.
    Werd ich auch tun.
    Das ist ja nur ein Test-proggi
    aber ich dachte schon, ich ich steh irgendwo in der Pampa :D

    Besten Dank für den Hinweis.

    Gruß, root

  • Nichts zu danken, noch ein Hinweis:

    Ich habe einige der DS18B20 im 3-Drahtbetrieb im Einsatz. Nach einem Reset liefert lt. Datenblatt der Sensor immer 85,000 Grad. Bei einem meiner Sensoren passiert das im Dauerbetrieb tatsächlich auch alle 2-3 Tage mal (ich lasse ein Log führen, deswegen fiel es mir auch gleich auf). Hab' keine Ahnung, warum.
    Der CRC stimmt dann natürlich. Nachdem bei meinen Anwendungen 85,000 Grad nicht vorkommen (da wäre schon die Feuerwehr da). behandle ich diesen Wert wie einen CRC Fehler und lasse sofort eine weitere Messung durchführen, die bisher auch immer geklappt hat.

    Gruß, mmi

Jetzt mitmachen!

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