Forum: PC-Programmierung Linux "echo 1 > /dev/." in C programmieren


von Pit (Gast)


Lesenswert?

Hallo Experten!

Bin Anfänger, daher wahrscheinlich für Euch einfach zu lösen:

Ich schalte LEDs eines Boards mit "echo 1 > /dev/led1" oder "echo 0 > 
/dev/led1" an und aus.

Wie sieht das ganze aus, wenn ich es in C programmieren will?

fd=open("/dev/led1", WR_ONLY);
write(fd, 1, 1);

funktioniert leider nicht?

Danke schonmal.

von Johann L. (radiostar)


Lesenswert?

write(fd, "1", 1);

von Peter II (Gast)


Lesenswert?

Pit schrieb:
> fd=open("/dev/led1", WR_ONLY);
> write(fd, 1, 1);
>
> funktioniert leider nicht?

hätte es auch so gemacht, aber was heist
> funktioniert leider nicht?

geht das open schief, geht das write schief, bekommst du eine 
fehlermeldung, versteht es der compiler nicht?

von CR (Gast)


Lesenswert?

das 'echo 1 > /dev/led1' schreibt zwei Zeichen nach /dev/led1:

0x31 0x0d

Versuch also mal:

write(fd, "1\n", 2);

von Pit (Gast)


Lesenswert?

Danke für die Antworten. Jetzt gehts. So muss es aussehen damits 
funktioniert:

fd=open("/dev/led1", O_RDWR);
write(fd, "1", 1);

Also als erstes mal das Gerät zum Lesen und Schreiben öffnen, dann die 1 
in Anführungszeichen.

Danke!

von Null (Gast)


Lesenswert?

Pit schrieb:
> Also als erstes mal das Gerät zum Lesen und Schreiben öffnen, dann die 1
> in Anführungszeichen.

1 in Anführungszeichen ist ein String. Also mit \n terminiert.

Der Gedanke

CR schrieb:
> write(fd, "1\n", 2);

war also Richtig, nur das 0x31 und \0 (also 0x00) gesendet werden sollte

von Null (Gast)


Lesenswert?

Natürlich mit \0 terminiert

von Le X. (lex_91)


Lesenswert?

Nur aus Interesse:
was verbirgt sich denn hinter "/dev/led1"?
Eine (virtuelle) serielle Schnittstelle?

von /dev/lde (Gast)


Lesenswert?

le x. schrieb:
> was verbirgt sich denn hinter "/dev/led1"?
>
eine virtuelle Datei, die von einem süeziellen Kernelmodul verwaltet 
wird. Schreibt man in diese "Datei" etwas rein, setzt das Kernelmodul 
den "Dateiinhalt" in entsprechende I/O-Kommandos um.

...mal ganz populärwissenschaftlich ausgedrückt...

von Daniel F. (df311)


Lesenswert?

/dev/lde schrieb:
> eine virtuelle Datei, die von einem süeziellen Kernelmodul verwaltet
> wird. Schreibt man in diese "Datei" etwas rein, setzt das Kernelmodul
> den "Dateiinhalt" in entsprechende I/O-Kommandos um.

echo str_replace("ü", "p", $str);

also ein handelsübliches character-device? ;-)

von Uwe (Gast)


Lesenswert?

Wird z.B. bei OpenWRT benutzt um Status LEDs an und auszuschalten.

von (prx) A. K. (prx)


Lesenswert?

Faulpelze machen aus dem Dreizeiler open/write/close einen Einzeiler:
   system("echo 1 > ...")

von imonbln (Gast)


Lesenswert?

A. K. schrieb:
> Faulpelze machen aus dem Dreizeiler open/write/close einen Einzeiler:
>    system("echo 1 > ...")

System ist böse, lernt man doch immer wieder ;-) ! Nebenbei ist das doch 
meher als Overkill. der Kernel muss eine kompletten Prozess ansetzen nur 
um eine "1" in ein Characater device zu schreiben.
Wer so Optimiert, der hat ein an der Waffel ehrlich. Wenn man das öfter 
in einen Programm braucht, pack es in eine Funktion oder ein marco.

von (prx) A. K. (prx)


Lesenswert?

imonbln schrieb:
> System ist böse, lernt man doch immer wieder ;-) !
> Nebenbei ist das doch meher als Overkill.

Ich weiss auch nicht, ob ich das im produktiven Einsatz wirklich so 
machen würde. Aber eine Möglichkeit für quick-and-dirty wärs schon.

Natürlich ist das Overkill. Der Punkt ist nur: Ab wann spielt Overkill 
eine Rolle? Wenn ich im Programm intensives Bitbanging betreibe, dann 
schon. Wenn ich anfangs einmal irgendeine Einstellung vornehme, dann 
spielt dieser Aspekt hingegen keine Rolle.

Zum Thema Overkill habe ich ohnehin längst eine eher lockere Beziehung, 
da ich längst mehr in Perl als in C mache. Passt besser zu den Aufgaben, 
ist schneller fertiggestellt und in den allermeisten Fällen auch schnell 
genug.

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.