Forum: PC-Programmierung Raspberry Pi In C system() verwenden um Kommandobefehle auszuführen und Inhalt speichern


von Guest (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem. Auf dem Raspberry Pi können über das 
Terminal gewisse Daten wie zum Beispiel die CPU Temperatur ausgegeben 
werden. Das funktioniert auch soweit.


Diese Befehle möchte ich in C integrieren. Das geht ja ganz einfach über 
system().

Hier der Code für die Temperatur zum Beispiel:
1
#include <stdlib.h>
2
#include <stdio.h>
3
#include <string.h>
4
5
6
int main() 
7
{
8
  system("cat/sys/class/thermal/thermal_zone0/temp");
9
  
10
  
11
  
12
  return(0);  
13
}

Dann bekomm ich auch eine Temperatur im Terminal angezeigt. 52000 zum 
Beispiel, also 52 Grad Celsius. Nun möchte ich aber gerne diesen Wert in 
eine Variable speichern um sie später über ein File zu übergeben.


Habe dazu leider keine Lösung gefunden.



Grüße

: Verschoben durch User
von MBr (Gast)


Lesenswert?

Hi, Du kannst einfach den Wert in ein File schreiben mit

system("cat/sys/class/thermal/thermal_zone0/temp > Wert.out");

dann legt jeder Aufruf den Wert in Wert.out ab. Mit

system("cat/sys/class/thermal/thermal_zone0/temp >> Wert.out");

wird das Ergebnis an die neue Datei angefügt!

von Peter II (Gast)


Lesenswert?

Guest schrieb:
> Habe dazu leider keine Lösung gefunden.

warum liest du den Inhalt nicht einfach aus

/sys/class/thermal/thermal_zone0/temp

was anders macht cat auch nicht. Also einfach die Datei öffnen ( fopen) 
und sie auslesen, dafür System zu missbrauch ist doch ziemlich sinnlos.

von Guest (Gast)


Lesenswert?

MBr schrieb:
> Hi, Du kannst einfach den Wert in ein File schreiben mit
>
> system("cat/sys/class/thermal/thermal_zone0/temp > Wert.out");
>
> dann legt jeder Aufruf den Wert in Wert.out ab. Mit
>
> system("cat/sys/class/thermal/thermal_zone0/temp >> Wert.out");
>
> wird das Ergebnis an die neue Datei angefügt!

Das sind aber c++ befehle oder?
Ich arbeite in ANSI C.

von Peter II (Gast)


Lesenswert?

Guest schrieb:
> Das sind aber c++ befehle oder?
> Ich arbeite in ANSI C.

dir viele verdammt viele Grundlagen - das ">>" an dieser Stelle 
überhaupt nicht mit C++ zu tun.

Wie schon oben geschrieben, ist der komplette Ansatz mit system falsch.

von Guest (Gast)


Lesenswert?

Peter II schrieb:
> Guest schrieb:
>> Habe dazu leider keine Lösung gefunden.
>
> warum liest du den Inhalt nicht einfach aus
>
> /sys/class/thermal/thermal_zone0/temp
>
> was anders macht cat auch nicht. Also einfach die Datei öffnen ( fopen)
> und sie auslesen, dafür System zu missbrauch ist doch ziemlich sinnlos.

Vielen Dank. Bin nicht ganz fit mit den Terminalbefehlen.

Das bedeutet ich öffne einfach nacheinander die Dateien und schreibe mir 
den Wert weg.

Danke

von Sheeva P. (sheevaplug)


Lesenswert?

Guest schrieb:
> MBr schrieb:
>> Hi, Du kannst einfach den Wert in ein File schreiben mit
>>
>> system("cat/sys/class/thermal/thermal_zone0/temp > Wert.out");
>> [...]
>
> Das sind aber c++ befehle oder?

Nein, das sind Shell-Befehle.

> Ich arbeite in ANSI C.

Warum nur?

von Peter II (Gast)


Lesenswert?

Guest schrieb:
> Das bedeutet ich öffne einfach nacheinander die Dateien und schreibe mir
> den Wert weg.

ja

von Guest (Gast)


Lesenswert?

So bekomme ich schonmal die Temperatur und das Modell:
1
  GPIO = fopen("/sys/class/thermal/thermal_zone0/temp", "r");
2
  fgets(Daten, sizeof(Daten), GPIO);
3
  fclose(GPIO);
4
  printf("Temperatur ist:\n");
5
  printf("%s", Daten);
6
  
7
  GPIO = fopen("/sys/firmware/devicetree/base/model", "r");
8
  fgets(Daten1, sizeof(Daten1), GPIO);
9
  fclose(GPIO);
10
  printf("Pi Model ist:\n");
11
  printf("%s", Daten1);

Jetzt hab ich aber nich Befehle wie:


CPU Spannung:

vcgencmd measure_volts

Und CPU Frequenz:

vcgencmd measure_clock arm


Wie kann ich das lösen. Mit diesen >> Operatoren hab ich noch nie 
gearbeitet. Versteh nicht ganz wie ich das damit in eine Variable 
speicher.


Grüße

von Jack (Gast)


Lesenswert?

Echt jetzt? system() und ein cat, dann noch in eine Datei?!?

Ein bisschen Unix-Programmiergrundlagen könnte man sich ja schon 
aneignen, bevor man den Dicken Maker mit einem Raspberry macht:

open(), read() und close() in C.

Literaturempfehlung:

https://www.amazon.com/Advanced-Programming-UNIX-Environment-3rd/dp/0321637739

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Guest schrieb:
> So bekomme ich schonmal die Temperatur und das Modell:

Gut. Du solltest den Filepointer nach dem fopen noch prüfen, ob der Open 
denn auch funktioniert hat. Sonst crasht Dein Programm beim 
nachfolgenden fgets().

> Jetzt hab ich aber nich Befehle wie:
>
> CPU Spannung:
>
> vcgencmd measure_volts
>
> Und CPU Frequenz:
>
> vcgencmd measure_clock arm

Du musst also hier doch die Ausgabe eines externen Programms auswerten.

Erste Möglichkeit:

Du rufst das Programm mit Umlenkung auf eine Datei auf, also zum 
Beispiel:

  system ("vcgencmd measure_volts >/tmp/volts");

und liest dann die Datei /tmp/volts aus - genauso wie Du das mit fopen() 
und fgets() für die Temperatur gemacht hast.

Zweite Möglichkeit:

Diese wäre dann schon höhere Programmierkunst. Du öffnest aus Deinem 
Programm eine Pipe zu dem externen Programm per fork(), dup(), exec() 
und liest direkt vom Programm - genau so, wie eine Shell die Ausgabe 
eines Programms per Pipe an ein anderes Programm weitergibt.

Aber wie ich Deinen Wissensstand einschätze, ist das noch zu früh für 
Dich. Benutze also Möglichkeit 1. Die ist trivial. Wenn Dich der feste 
Name /tmp/volts stört (auf Mehrbenutzersystemen könnte es da schon mal 
zu Konflikten kommen), schau Dir das Manual zu mktemp() an. Das wäre 
aber dann erst im nächsten Schritt zu tun.

: Bearbeitet durch Moderator
von Thomas (Gast)


Lesenswert?

Hallo,

das Kommando mit "popen" öffnen.

Also z.b.

fd = popen("/bin/uname ....

fgets ( ... fd ...

https://linux.die.net/man/3/popen

Gruß,
Thomas

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Thomas schrieb:
> das Kommando mit "popen" öffnen.

Ja, das ist natürlich der schnellere Weg :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.