Hallo,
meine ersten "Programme" auf dem Raspberry waren bash und Shell Scripte. Dann fürs WebIf noch php.

Mit dem Gedanken, dass per GCC compilierte Programme weniger Ressourcen benötigen, habe ich mich entschlossen, die Scripte in "echte" Programme zu wandeln.

Da fingen sie dann an, die Probleme. Hier mal eine Klammer oder Leerstelle anders als im BASH und oder php. Nach und nach die Fehler soweit ausgemerzt. (Zumindest gedacht)
Nun habe ich ein Programm, welches alles gesendete vom AVR entgegen nimmt uns auswertet. Ein weiteres sendet zu diesem hin. Ein drittes überwacht den Mediaplayer Dämonen.

Soweit läuft es. Bis dann plötzlich im Internetradio ein Lied mit Klammern im Titel lief. Das Programm, welches den mpd überwacht sendet den Titel dann mittels dem Sendeprogramm zum AVR. Dieses nimmt alles, was gesendet werden soll aus den Startparametern argv[]. Wenn jetzt eine Klammer darin vorkommt, dann kommt eine Fehlermeldung. Kommt ein & drin vor, nimmt es nur bis zum & an und ignoriert den Rest. Also wird vor dem Aufruf des Sendenprogrammes jetzt auch noch der Text geparst.

Ursprünglich sollte alles ein Programm erledigen. Jedoch habe ich es nicht geschafft, wie im BASH ein Programm im Hintergrund /bzw. unabhängig von meinem aufzufrufen. Im BASH wird einfach ein & am Ende des Aufrufes gehängt. Zur Not noch ein disown hinterher. Alles dies klappt per C-Programm nicht mehr. Selbst, wenn ich eine BASH aufrufe, welches dann das nächste Programm mittels "& disown" startet, wartet mein Programm solange, bis die Kette an Sripten und Programmen dazwischen beendet wurden.

Auch das Sendenprogramm mittels Parameter in "Häkchen" aufzurufen ist, aus welchen Gründen auch immer, gescheitert. In eine Textdatei umgeleitet, erscheinen die Häkchen brav.

Dann sollen vom AVR ankommende Parameter in einer Datei gespeichert werden, damit der php-Code des WebIf diese auslesen kann. Konnte es natürlich nicht. Die Rechte der vom C-Programm angelegten Datei waren mal 600 und dann plötzlich mal 140 oder 104. Also nach dem Erstellen der Datei noch ein system("chmod 644 /tmp/webif.farben"); hinterher.

Stringschiebereien bieten allgemein für eingefleischte BASIC Programmierer (oder zumindest für mich) noch ein paar Fallstricke mehr. Ich habe zwischendurch ja schon C-"Erfahrung" gesammelt, wenn ich mal vorhandenen Code für den AVR an meine Vorstellungen angepasst habe, aber Bewusst geworden, was da so alles lauert ist, ist es mir erst in den letzten 2 Tagen. Ist also doch ein Unterschied, ob man was (Kleinigkeiten) anpasst oder komplett neu erstellt.

Was mir weiter aufgefallen war: Wenn eine Klammer übergeben wurde (werden sollte): Die dann gemeldete Fehlermeldung begann mit "sh:". Quasi so, als ob da im Hintergrund dann wieder die Shell ackert...

Allgemein bietet die Suche im Netz nach der richtigen Syntax auch nicht viel brauchbares. Kann aber auch daran liegen, dass "c" auch recht häufig unabhängig vom Programmieren genutzt wird.

Wenn ich z.B. das Ergebnis einer Funktion in eine Variable speichern möchte, dann wird das in den Beispielen so gut wie nicht gemacht. Die geben gleich immer alles auf der Konsole aus. Ist mir bei C wie auch bei BASH aufgefallen. printf(...) / echo blablub. Dass da mal ein $() drumgehört passt zwar oft, aber doch nicht immer. Da ist es mit den Klammern ja fast schon wieder einfach, auch wenn ich diese aus Flüchtigkeit noch hin und wieder vergesse.